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



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

我知道存储库应该返回聚集根,这些域实体中的哪一个是聚集根?还是全部(我需要每个都有一个存储库吗)?

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

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

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

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

我没有使用存储库的经验,但我建议,如果您计划使用多种方法搜索代理,我建议您创建一个标准接口/类。这将允许您使用单个方法调用(firstname/lastname、firstname/city等)进行多种类型的组合搜索。

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

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
}

最新更新