使用以下域模型: 世界 - >特许经营 - >办公室 - >剂
据我所知,存储库应该返回aggrigate根,这些域实体中的哪一个是aggrigate root?或者全部(我是否需要每个存储库)?
我希望能够通过url传递的id来获取实体。我在哪里放置这些GetById方法?
如果我想获得一个名为“Jo”的部分名字的特许经营中的所有代理商的列表,我该如何将其构建到系统中?我是不是该: 在特许经营实体中有一个基本上是.SelectMany linq语句的方法吗? 或者有一个具有GetByPartialFirstName()方法的代理的存储库?
答案 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
}