Я пытаюсь добавить интерфейс для создания общего кода для 2 моделей репозитория баз данных, однако в каждой модели базы данных возвращается другой тип, и я не смог найти решение. Это похоже на то, что это должно быть возможно, но я вне идеи, может кто-нибудь указать мне в правильном направлении или сказать мне, если это невозможно.
Код - Интерфейс:
interface IPermissions
{
//List<User> getUser(string userID);
List<Role> getUserPermissions(string userName);
List<Role> getAllPermissions();
void enable();
void disable();
void addPermission(string permissionName);
void removePermission(string permissionName);
}
Модель 1:
public List<AUser> getUser(string userName)
{
IEnumerable<AUser> users = from x in a.AUsers
where x.UserID == userName
select x;
List<AUser> usersList = users.ToList();
return usersList;
}
public List<AGroup> getUserPermissions(string userName)
{
IEnumerable<AGroup> usersPermisions = from abfug in a.UserGroups
join abfg in a.Group on abfug.GroupID equals abfg.ID
join au in a.AUsers on abfug.UserID equals au.ID
where au.UserID == userName
select abfg;
List<Group> usersList = usersPermisions.ToList();
return usersList;
}
Модель 2:
public List<UCUser> getUCUser(string userName)
{
IEnumerable<UCsUser> users = from y in UC.UCUsers
where y.UserID == userName
select y;
List<UCyUser> usersList = users.ToList();
return usersList;
}
public List<UCGroup> getUCUserPermissions(string userName)
{
IEnumerable<UCGroup> userPermissions = from bfug in UC.UCUserGroups
join bfg in UC.UCGroups on bfug.GroupID equals bfg.ID
join u in UC.UCUsers on bfug.UserID equals u.ID
where u.UserID == userName
select bfg;
List<UCGroup> usersList = userPermissions.ToList();
return usersList;
}
Если в коде есть какие-либо опечатки, пожалуйста, несите меня.
Любая помощь будет принята с благодарностью.
Когда вы используете общий шаблон, вы создаете общий интерфейс:
public interface IRepository<TModel>
{
IEnumerable<TModel> Retrieve();
void Create(TModel model);
void Delete(TModel model);
void Update(TModel model);
}
public class RoleRepository : IRepository<Role>
{
IEnumerable<TModel> Retrieve()
{
using (var context = new MyContext())
{
return context.Roles.ToList(); // iterating through them hits the database
}
}
public void Create(TModel model)
{
using (var context = new MyContext())
{
context.Set<TModel>().Attach(model);
context.SaveChanges();
}
}
public void Delete(TModel model) {}
public void Update(TModel model) {}
}
public class MyController : Controller
{
private readonly IRepository<Role> roleRepository;
public MyController(IRepository<Role> roleRepository)
{
this.roleRepository = roleRepository;
}
}
Как только вы это сделаете, вы, как правило, скрываете это за сервисом. Тогда у вас есть надлежащее серость проблем. Уровень репозитория скрывает контекст, так что он может легко меняться. Слой службы скрывает репозиторий, чтобы он мог легко меняться, а также вы можете добавить эти функции для работы в службу.
public class MyService : IMyService
{
private readonly IRepository<Role> roleRepository;
public MyService(IRepository<Role> roleRepository)
{
this.roleRepository = roleRepository;
}
public IEnumerable<Role> LetsDoSomeCoolThings()
{
// some complicated role specific function to return a complex set of results
}
}
Теперь, очевидно, вы заменили бы Repository
в контроллере для этой службы