Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC 3我应该如何设计我的存储库/DAL?_Asp.net Mvc 3_Domain Driven Design - Fatal编程技术网

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

Asp.net mvc 3 MVC 3我应该如何设计我的存储库/DAL?,asp.net-mvc-3,domain-driven-design,Asp.net Mvc 3,Domain Driven Design,使用以下域模型: 世界->特许经营->办公室->代理 我知道存储库应该返回聚合根,这些域实体中哪一个是聚合根?或全部(我是否需要每个存储库) 我希望能够通过url传递的id获取实体。我应该把这些GetById方法放在哪里 如果我想得到一份特许经营范围内所有代理商的名单,其中部分名为“Jo”,我如何将其构建到系统中?我应该: 在特许经营实体中有一个基本上是.SelectMany linq语句的方法吗? 或者为具有GetByPartialFirstName()方法的代理创建存储库?我没有存储库方面的

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

我知道存储库应该返回聚合根,这些域实体中哪一个是聚合根?或全部(我是否需要每个存储库)

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

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

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

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

public IEnumerable/IQueryable获取(IAgentCriteria)
{
如果(Critiria==null)抛出新ArgumentNullException();
var结果=实体。代理;
如果(!string.isNullEmptyYorWhitespace(Criteria.FirstNameStartsWith))
{
result=result.Where(x=>x.FistName.StartsWith(Criteria.FirstNameStartsWith));
}
//等等
}

取决于域逻辑,如果实体将由其自己使用,则它是聚合根,如果您希望直接从您的用户代码获取“代理”实例和调用方法,则它应该有自己的存储库,否则,如果它将作为“Office”的一部分使用,并从其根“Office”调用其方法然后它不是聚合根,您不需要从存储库中独立获取它


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

好的,看起来几乎每个实体都会有一个存储库类,我担心这是一个反模式。我不认为这是一个反模式为什么会这样?如果您的用例是获取和保存每个实体,那么您需要为每个实体创建一个存储库。。这么简单
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
}