Entity Framework: получение данных из нескольких объектов с использованием общего хранилища - PullRequest
0 голосов
/ 28 сентября 2018

Я создал проект Web API, в котором я реализую шаблон хранилища.В двух словах, у меня есть следующая структура.

Controller
    |
Business/Service Layer
    |
Repository
    |
DB-Access

Вот код одного из моих сервисных уровней:

public class DashboardService : IDashboardService
{   
    private readonly IRepository<USERROLE> repoUserRole;
    private readonly IRepository<ROLEEXT> repoRoleExt;  

    public void GetUserInstitution(string UserId)
    {
        repoUserRole.GetList(x => x.ID == UserId, null).Join(
            repoRoleExt.GetList(),
            uRole => uRole.ROLEID, roleEx => roleEx.ROLEID, (uRole, roleEx) => new
            {
                USERROLE = uRole,
                ROLEEXT = roleEx
            }).ToList();
    }
}

GetList Метод в репозитории выглядит следующим образом:

public class Repository<T> : IRepository<T> where T : class, new()
{
    // Some code omitted
    public IEnumerable<T> GetList()
    {
        return DbSet.ToList();
    }

    public IEnumerable<T> GetList(Expression<Func<T, bool>> predicate, params string[] navigationProperties)
    {
        IEnumerable<T> list;
        var query = DbSet.AsQueryable();
        if (navigationProperties != null && navigationProperties.Length > 0)
        {
            foreach (string navigationProperty in navigationProperties)
            {
                query = query.Include(navigationProperty);
            }
        }
        list = query.Where(predicate).ToList<T>();
        return list;
    }
}

Что я хочу:

  • Универсальный метод, который может принимать несколько сущностей (объединять их) и возвращать набор результатов.(Также, где этот метод должен быть? (Бизнес или Репо)

Как видно из моего кода, я придерживался следующего подхода:

  • Создание экземпляра каждого репозитория <=> Объект типа объекта
  • Использование этих объектов позволяет получить данные

Проблема:

  • Не уверен, что это правильный подходРеализация шаблона хранилища!
  • Если нет Каков наилучший способ справиться с этим?

PS: Мне известно об ошибке, присутствующей в методе GetUserInstitution.

Редактировать : Кроме того, если не используется универсальный репозиторий, нужно ли создавать несколько репозиториев на основе Entites?

1 Ответ

0 голосов
/ 28 сентября 2018

Вам действительно следует подумать о создании отдельных репозиториев с отдельными договорами для каждой сущности, а не пытаться создавать общий репозиторий.Не все ваши репозитории НУЖДАЮТСЯ в возврате списка, и не имеет смысла иметь репозитории, которые не реализуют методы для создания шаблонных исключений NotImplementedExceptions или подобных вещей.Вместо этого следуйте подходу, принятому многими моими инженерами: просто создавать отдельные контракты / интерфейсы для каждого репозитория.Может показаться, что создание единого универсального репозитория будет следовать правилу SRP, но после того, как вы начнете создавать все больше и больше репозиториев, вы начнете видеть некоторые своеобразные атрибуты репозиториев, и, в конце концов, вам будет лучше без универсального репозитория.

Один из вариантов создания интерфейса для класса репозитория выглядит следующим образом:

public interface IRepository<T> where T : IAggregateRoot

Затем вы должны использовать его как

    public interface IOrderRepository : IRepository<Order>
{
Order Add(Order order);
// ...
}

IAggregateRoot выше - это интерфейс маркерашаблон.

Честно говоря, я бы просто начал с разных контрактов на репозиторий, а позже, если есть смысл добавить IRepository, сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...