我正在通过Eric Evans的领域驱动设计,他概述了存储库和工厂之间的相互作用.存储库本身将调用DB接口来获取结果集.然后将该结果集传递给工厂,该工厂将理解该结果集以重构该对象.
如果数据本质上是分层的,就像某种树结构那样.例如:
public class Foo { public int Id { get; set; } public string Name { get; set; } public Foo Parent { get; set; } public ICollection{ get; set; } // Other business like methods here }
使用DDD我会有我的接口和实现:
public interface IFooRepository { Foo Get(int id); } public interface IFooFactory{ Foo Create(TSource source); } public class SqlFooRepository: IFooRepository { private readonly IFooDao dao; private readonly IFooFactory 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 { 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; } }
如果我试图在工厂建立孩子,那么我需要再次访问回购.如果我在Repo中这样做,我觉得我正在做的工作应该是工厂.不知道如何解决这个问题.
我有一个想法是,Foo不是聚合根,而是FooTree是聚合根.因此,我需要创建整个树,这意味着我可以将Foo对象的集合传递给FooTreeFactory.
任何帮助将非常感激.