MVC 3我应该如何设计我的存储库/ DAL?

时间:2012-01-09 23:37:47

标签: asp.net-mvc-3 domain-driven-design

使用以下域模型: 世界 - >特许经营 - >办公室 - >剂

据我所知,存储库应该返回aggrigate根,这些域实体中的哪一个是aggrigate root?或者全部(我是否需要每个存储库)?

我希望能够通过url传递的id来获取实体。我在哪里放置这些GetById方法?

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

2 个答案:

答案 0 :(得分:2)

取决于域逻辑,如果实体要由它自己使用,则它是聚合根,如果你想获得“Agent”的实例并直接从你的消费者代码中调用方法,那么它应该拥有它自己的存储库,否则,如果要将其作为“Office”的一部分使用,并且从其根“Office”调用其方法,则它不是聚合根,您不需要从存储库中独立获取它。

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

答案 1 :(得分: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
}