2012-01-09 62 views
1

用下面的域模型: 世界 - >特许经营 - >办公 - >代理MVC 3我应该如何设计我的存储库/ DAL?

据我了解,库应该返回aggrigate根,这些领域的实体是aggrigate根源在哪里?或所有(我需要每个存储库)?

我希望能够通过由URL传递的ID获取实体。我在哪里放这些GetById方法?

如果我想获得特许经营店内部分名字为“Jo”的所有代理商的清单,我该如何将其构建到系统中?我应该: 在特许经营实体中有一个基本上是.SelectMany linq声明的方法吗? 或具有GetByPartialFirstName()方法的代理的存储库?

回答

2

视域的逻辑,如果实体是由它自己消耗那么它就是一个聚合根,如果你想为了得到一个“代理”的实例,并直接从你的消费者代码中调用方法,那么它应该有它自己的存储库,否则如果它被作为“Office”的一部分使用,并且它的方法从它的根“Office”调用,那么它不是一个聚集根,你不需要从存储库中独立地获取它。

将此规则应用于所有实体以决定为其创建存储库。

+0

好吧,看起来好像几乎每个实体最终都会有一个存储库类,我担心这是一种反模式。 – modelMan 2012-01-10 17:42:37

+0

我不认为这是一种反模式为什么会这样?如果你的用例是获取并保存每个实体,那么你需要为每个实体创建一个存储库 – 2012-01-10 22:03:57

0

我没有存储库的经验,但我建议如果你打算有多种方式来搜索你的代理,我会建议创建一个标准接口/类。这将允许您使用单个方法调用(名字/姓氏,名字/城市等)执行多种类型的组合搜索。

(我喜欢使用的接口,以保持我的应用程序和数据源去耦)

public IEnumerable/IQueryable<IAgent> Get(IAgentCriteria Criteria) 
{ 
    if (Critiria == null) throw new ArgumentNullException(); 

    var result = entities.Agents; 

    if (!string.IsNullEmptyOrWhiteSpace(Criteria.FirstNameStartsWith)) 
    { 
    result = result.Where(x => x.FistName.StartsWith(Criteria.FirstNameStartsWith)); 
    } 

    // etc etc 
} 
相关问题