.net 存储库边界

.net 存储库边界,.net,design-patterns,.net,Design Patterns,假设应用程序在存储库接口、实现库和BLL BPL中具有业务对象库,那么您如何决定哪些需要与存储库耦合,哪些直接到BPL BOs.dll ISomeObjectRepository.cs Repositories.dll SomeObjectRepository.cs BPL.dll SomeObjectService.cs 所以问题是,谁负责GetSomeObjectByWeirdFields的实现?欢迎使用任何模式指南。存储库接口存在于您提到的域层业务层中,它定义了在域模型中抽象存储库的契约

假设应用程序在存储库接口、实现库和BLL BPL中具有业务对象库,那么您如何决定哪些需要与存储库耦合,哪些直接到BPL

BOs.dll ISomeObjectRepository.cs

Repositories.dll SomeObjectRepository.cs

BPL.dll SomeObjectService.cs


所以问题是,谁负责GetSomeObjectByWeirdFields的实现?欢迎使用任何模式指南。

存储库接口存在于您提到的域层业务层中,它定义了在域模型中抽象存储库的契约

服务层依赖于存储库和ObjectRepository的抽象,对具体实现一无所知

对于在何处实现具体存储库的问题,应在较低的层中进行定义,该层可称为数据访问层、技术服务层或持久性层,无论您如何称呼它。重要的是,您应在不同的组件中实现它,可以替换此组件,而不会影响所有其他层,也不会影响存储库接口。例如,您可以使用NHibernate实现您的存储库,稍后您可以决定用实体框架实现、Ado甚至xml文件替换它

问题是,存储库的具体实现应该在属于技术服务或数据访问的另一个组件中分离

选中此项可在单独的层中使用NHibernate获得存储库的示例实现

public interface ISomeObjectRepository:  
IRepository<SomeObject>, ILazyFetchingRepository<SomeObject>  
{  
      SomeObject GetSomeObjectByWeirdFields(IDictionary<string, object> weirdFields);  
} 
public sealed class SomeObjectRepository:  
BaseRepository<SomeObject>, ISomeObjectRepository  
{  
     public SomeObject GetSomeObjectByWeirdFields(IDictionary<string, object> weirdFields){  
         throw new NotImplementedException();  
        }  
}
public static class SomeObjectService:  
{  
     public static SomeObject GetSomeObjectByWeirdFields(IDictionary<string, object> weirdFields){  
           throw new NotImplementedException();  
     }  
}