Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns IRepository<;T>;每个实体的存储库和存储库_Design Patterns_Domain Driven Design_Irepository - Fatal编程技术网

Design patterns IRepository<;T>;每个实体的存储库和存储库

Design patterns IRepository<;T>;每个实体的存储库和存储库,design-patterns,domain-driven-design,irepository,Design Patterns,Domain Driven Design,Irepository,我正在更改企业会计应用程序的体系结构。我将使用IRepositoy模式,但有一点不同。我将为每个从基础IRepository派生的实体创建一个接口。例如,如果我的实体是客户、产品和订单,那么我将 IClientRepository:IRepository IPProductRepository:IRepository IOrderRepository:IRepository 公共接口IRepository { TDataModel-Get(TId-Id); IList列表(); TDataMod

我正在更改企业会计应用程序的体系结构。我将使用IRepositoy模式,但有一点不同。我将为每个从基础IRepository派生的实体创建一个接口。例如,如果我的实体是客户、产品和订单,那么我将

IClientRepository:IRepository
IPProductRepository:IRepository
IOrderRepository:IRepository

公共接口IRepository
{
TDataModel-Get(TId-Id);
IList列表();
TDataModel添加(TDataModel项);
TDataModel添加(TDataModel项,IContext executingContext);
作废更新(TDataModel项);
无效更新(TDataModel项,IContext executingContext);
bool删除(TId Id);
bool Delete(TId Id,IContext executingContext);
IList在哪里
(System.Linq.Expressions.Expression-criteria);
}
公共接口IPProductRepository:IRepository
{
}
使用这种方法的原因是我想在DAL中设置一些领域模型的属性,而不是在BLL中-例如设置一些实体的CreationDate(顺便问一下,这样做对吗?)

我看到了一些阳性样本,但找不到任何使用这种组合的样本。我想知道这样做有什么好处吗?这完全正确吗?还有什么其他的优点和缺点


提前感谢

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

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

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

为什么需要更新方法?您使用的是自定义构建数据访问层还是依赖于其中一个ORM?是的,我使用的是NHibernate,但在其他项目中,我也有更新方法,这是错误的吗?感谢Addys,本例中的CreationDate只是一个信息字段,供用户知道实体何时创建,许多财务操作也依赖于此日期(例如,为了计算账户的利息,我们需要知道账户何时创建)因为这是一个客户机/服务器应用程序,所以我们使用一个全局属性:UTIL.Server CurrentDATECTIME来设置实体的创建日期。但是在所有的场景中,我们只将UTILS.Server CurrentDATE放入这个字段,这就是为什么我不认为它是一个特定于域的操作。还有其他情况,例如我们的用户需要知道E。日期字段在其本地日历(shamsi calendar)中的值相等,因此如果我们有一个CreationDate字段(对于实体),然后我们还需要为该实体创建一个CreationDateSh。CreationDateSh以某种方式自动计算,因为我们只需要将CreationDate的shamsi等效项放入其中。我们再次通过重载repository Insert()和Update()来完成此任务
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>
{

}