IRepository<T> и Repository-Per-Entity

Я меняю архитектуру корпоративного бухгалтерского приложения. Я собираюсь использовать шаблон IRepositoy, но с небольшой разницей. Я собираюсь сделать интерфейс для каждой сущности, которая является производной от базового IRepository. например, если бы мои объекты были Клиент, Продукт и Заказ, то я бы

IClientRepository: IRepository
IProductRepository: IRepository
IOrderRepository: IRepository

public interface IRepository<TDataModel, TId>
{
    TDataModel Get(TId Id);
    IList<TDataModel> List();

    TDataModel Add(TDataModel Item);
    TDataModel Add(TDataModel Item, IContext executingContext);

    void Update(TDataModel Item);
    void Update(TDataModel Item, IContext executingContext);

    bool Delete(TId Id);
    bool Delete(TId Id, IContext executingContext);

    IList<TDataModel> Where
       (System.Linq.Expressions.Expression<Func<TDataModel, bool>> criteria);
}


public interface IProductRepository : IRepository<DataModel.Product, int>
{

}

причина использования этого подхода в том, что я хочу установить некоторые атрибуты модели предметной области в DAL, а не в BLL - например, установить CreationDate для некоторых объектов (кстати, правильно ли это делать?)

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

заранее спасибо

1 ответ

Решение

Я думаю, это зависит от того, как вы думаете о дате создания. Это часть домена или нет? Зависит ли какая-либо предметная логика от значения?

Например, нужна ли системе возможность "создавать от имени" (в этом случае создатель и дата создания не будут равны текущему пользователю и текущему времени)? Может ли что-нибудь сломаться, если восстановление данных из резервной копии не сохранит исходные значения? Имеет ли для вас значение, является ли дата создания клиентским временем, серверным временем или базой данных?

Если ответом на все вышеизложенное является "НЕТ", то A) дата создания не является частью домена, поэтому ее можно установить внешне B) она вам вообще нужна? если так, то я предполагаю только для инфраструктурных проблем - управление кэшем, уведомления об изменениях и т. д. Это правильно?

Другие вопросы по тегам