Использование интерфейса для создания универсального кода для 2 моделей баз данных в MVC 5

1

Я пытаюсь добавить интерфейс для создания общего кода для 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;
}

Если в коде есть какие-либо опечатки, пожалуйста, несите меня.

Любая помощь будет принята с благодарностью.

  • 0
    Вы смотрите на использование шаблона репозитория, посмотрите на ответ, который я даю здесь для совета
Теги:
asp.net-mvc-5

1 ответ

0
Лучший ответ

Когда вы используете общий шаблон, вы создаете общий интерфейс:

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 в контроллере для этой службы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню