【问题标题】:IRepository<T> and Repository-Per-EntityIRepository<T> 和 Repository-Per-Entity
【发布时间】:2011-01-27 12:38:50
【问题描述】:

我正在更改企业会计应用程序的架构。我将使用 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 示例,但找不到使用这种组合的任何东西。我想知道这样做有什么好处吗?完全正确吗?还有什么优缺点?

提前致谢

【问题讨论】:

  • 为什么需要更新方法?您是使用自定义构建数据访问层还是依赖其中一个 ORM?
  • 是的,我正在使用NHibernate,但是在其他项目中我也有更新方法,是不是错了?

标签: design-patterns domain-driven-design irepository


【解决方案1】:

我想这取决于您对创建日期的看法。它是域的一部分吗?任何域逻辑是否依赖于该值?

例如,系统是否需要“代表创建”的能力(在这种情况下,创建者和创建日期将不等于当前用户和当前时间)?如果从备份中恢复数据没有保留原始值,会有什么问题吗?创建日期是客户端的时间时间、服务器的时间时间还是数据库的时间时间,对你来说重要吗?

如果以上所有问题的答案都是“否”,那么 A)创建日期不是域的一部分,因此可以在外部设置 B)你真的需要它吗?如果是这样,那么我猜测只是为了基础架构问题 - 缓存管理、更改通知等。对吗?

【讨论】:

  • 感谢 Addys,此示例中的 CreationDate 只是一个信息字段,供用户了解何时创建实体,许多财务操作也取决于此日期(例如计算帐户的利息,我们需要知道帐户何时创建)。因为这是一个客户端/服务器应用程序,所以我们使用全局属性:Utils.ServerCurrentDateTime 来设置实体的 CreationDate。但在所有场景中,我们只是将 Utils.ServerCurrentDate 放入此字段,这就是为什么我不认为它是特定于域的操作。
  • 还有其他情况,比如我们的用户需要知道他们本地日历(shamsi日历)中日期字段的等效值,所以如果我们有一个CreationDate字段(对于一个实体),那么我们还需要为该实体创建一个 CreationDateSh。 CreationDateSh 以某种方式自动计算,因为我们只需要将 CreationDate 的 shamsi 等价物放入其中。我们再次通过重载存储库 Insert() 和 Update() 来完成这项任务
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多