存储库边界

时间:2011-06-13 03:26:42

标签: .net design-patterns

假设应用程序在存储库接口,实现库和BLL(BPL)中具有Business Objects库,您如何确定需要与存储库结合的内容以及直接与BPL相关的内容

BOs.dll
ISomeObjectRepository.cs

public interface ISomeObjectRepository:  
IRepository<SomeObject>, ILazyFetchingRepository<SomeObject>  
{  
      SomeObject GetSomeObjectByWeirdFields(IDictionary<string, object> weirdFields);  
} 

Repositories.dll
SomeObjectRepository.cs

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

BPL.dll
SomeObjectService.cs

public static class SomeObjectService:  
{  
     public static SomeObject GetSomeObjectByWeirdFields(IDictionary<string, object> weirdFields){  
           throw new NotImplementedException();  
     }  
} 

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

1 个答案:

答案 0 :(得分:0)

存储库接口存在于您提到的域层(业务层)中,它定义了在域模型中抽象存储库的合同。

服务层依赖于存储库的抽象(ISomeObjectRepository),对具体实现一无所知。

你的问题的答案是在哪里实现具体的存储库,它应该在较低层定义,可以称为数据访问层,技术服务层或持久层,无论你怎么称重要的是,您可以在不同的组件中实现它,可以替换此组件,而不会影响所有其他层,也不会影响存储库接口。例如,您可以使用NHibernate实现您的存储库,稍后您可以决定将其替换为Entity Framework实现,Ado甚至是xml文件。

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

检查http://sellandbuy.codeplex.com/以在单独的层中使用NHibernate获取存储库的示例实现。