【发布时间】:2013-12-06 12:33:15
【问题描述】:
我正在阅读 Eric Evans 的域驱动设计,他概述了存储库和工厂之间的相互作用。存储库本身将调用数据库接口来获取结果集。然后将该结果集传递给一个工厂,该工厂将理解该结果集以重构对象。
如果数据本质上是分层的,比如某种树状结构,那会怎样。例如:
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public Foo Parent { get; set; }
public ICollection<Foo> { get; set; }
// Other business like methods here
}
使用 DDD,我将拥有我的接口和实现:
public interface IFooRepository
{
Foo Get(int id);
}
public interface IFooFactory<TSource>
{
Foo Create(TSource source);
}
public class SqlFooRepository: IFooRepository
{
private readonly IFooDao dao;
private readonly IFooFactory<SqlDataReader> factory;
public SqlFooRepository(IFooDao dao, IFooFactory factory)
{
this.dao = dao;
this.factory = factory;
}
public Foo Get(int id)
{
var resultSet = dao.Find(id);
return factory.Create(resultSet);
}
}
public class SqlFooFactory: IFooFactory<SqlDataReader>
{
public Foo Get(SqlDataReader reader)
{
var foo = new Foo();
foo.Id = (int) reader["id];
foo.Name = (string) reader["name"];
// Do I build the children accounts here
return foo;
}
}
如果我尝试在工厂中构建孩子,那么我需要再次访问该仓库。如果我在回购中做这件事,我觉得我在做应该为工厂做的工作。不知道如何解决这个问题。
我的一个想法是 Foo 不是聚合根,而是 FooTree 是聚合根。因此,尝试获取任何 Foo 我需要创建整个树,这意味着我可以将 Foo 对象的集合传递给 FooTreeFactory。
任何帮助将不胜感激。
【问题讨论】:
-
获取方法,您可以构建 Foo 和所有相关的子项;您应在 SQL 查询中从数据库加载所有需要的记录,并以通用方式构建您的树(您拥有执行此操作所需的所有数据,例如ParentId、ChildId 和构建你的树);您不必在这里与您的存储库或除后端之外的任何其他层交谈!
-
您能否详细说明并以答案的形式进行。如果看起来最合适,我可以将您标记为已接受的答案。
标签: c# domain-driven-design ddd-repositories