使用以下域模型:世界->特许经营->办公室->代理
我知道存储库应该返回聚集根,这些域实体中的哪一个是聚集根?还是全部(我需要每个都有一个存储库吗)?
我希望能够通过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
}