Entity Framework / Unit of Work Архитектура Вопрос - PullRequest
0 голосов
/ 27 сентября 2011

Я очень хорошо знаком с UoW, шаблоном репозитория и т. Д., Но, видя различные реализации шаблона для Entity Framework, мне любопытно, почему у кого-то есть метод Save или Add в их хранилище.Если вы используете репозиторий, чтобы получить новый экземпляр объекта, который, как я предполагаю, кто-то уже

public Customer GetNewCustomer()
{
    Customer customer = new Customer();
     ... any initialization code here ...
    _context.Customers.AddObject(customer);
   return customer;
}

Я знаю, в некоторых проектах вы можете просто использовать

Customer customer = new Customer();

иего нигде не привязано к контексту.Тем не менее, я фанат частных конструкторов, так что для объекта Customer есть единая точка создания экземпляра.Имея это в виду, не имеет ли смысла никогда не использовать метод добавления / сохранения в хранилище при использовании шаблона UoW и иметь эту функцию только в интерфейсе IUnitOfWork?

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Я не думаю, что ваше решение верное. Это добавит пустого клиента к текущей единице работы. Это означает, что более позднему коду будет трудно, если он решит не экономить клиента на текущей единице работы.

Довольно часто в репозитории есть метод для сохранения сущности. Вы комбинируете два шаблона, используемых в дизайне, управляемом доменом

  • Репозиторий
  • Объект фабрики

Ответственность хранилища заключается в извлечении или хранении сущностей. Фабрика объекта отвечает за управление строительством объекта.

Btw. Закрытый конструктор вашей сущности не будет доступен в вашем хранилище, если хранилище не является сущностью (что было бы довольно плохо).

1 голос
/ 23 мая 2012

... не имеет ли смысла никогда не иметь метод добавления / сохранения на хранилище при использовании шаблона UoW и имеет только эту функциональность на интерфейсе IUnitOfWork?

Да, я думаю, что имеет смысл иметь метод Save только в интерфейсе IUnitOfWork. Однако я больше не использую шаблон хранилища с EF. Вместо этого я теперь использую эти варианты шаблонов команд и запросов.

Если вы подумаете об этом, EF DbContext действительно выполняет 3 вещи: 1.) он функционирует как ваш репозиторий для чтения состояния сущности, 2.) как ваш репозиторий для изменяющегося состояния сущности, и 3.) как UnitOfWork для отслеживание нескольких изменений и объединение их в одну транзакцию для сохранения мутаций состояния.

Итак, почему бы не разделить эти 3 обязанности на 3 различных интерфейса?

public interface IUnitOfWork
{
    int SaveChanges();
}

public interface ICommandEntities : IQueryEntities
{
    void Create(Entity entity);
    void Update(Entity entity);
    void Purge(Entity entity);
}

public interface IQueryEntities
{
    IQueryable<AggregateRoot1> AggregateRoot1s { get; }
    IQueryable<AggregateRoot2> AggregateRoot2s { get; }
    IQUeryable<AggregateRootN> AggregateRootNs { get; }

    IQueryable<TEntity> EagerLoad<TEntity>(IQueryable<TEntity> query, 
        Expression<Func<TEntity, object>> expression)
        where TEntity : Entity;
}

Затем вы можете реализовать эти 3 интерфейса в своем классе DbContext. Это сохраняет интерфейсы красивыми и разделенными, и позволяет зависимостям внедрять только те методы DbContext, которые вам нужны.

Например, ваш домен должен быть невежественным, верно? В этом случае не передавайте какие-либо зависимости классов вашего домена в интерфейс IUnitOfWork. Вместо этого обработайте IUnitOfWork в корне композиции IoC (или в фильтре действий MVC). Затем ваши обработчики запросов и команд работают только с интерфейсами ICommandEntities и IQueryEntities.

1 голос
/ 27 сентября 2011

Когда я следую идиоме Spring в Java, единицы работы (и транзакции) связаны со службами. Они используют объекты модели и персистентности для выполнения запроса. Транзакции размечаются с использованием аспектов.

Я не знаю, следует ли .NET аналогичной идее, но это стоило бы изучить. Имейте основанные на интерфейсе сервисы POCO и позволяйте им владеть транзакциями.

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