Я просматриваю дизайн Driven Driven Eric Evans, где он описывает взаимодействие между репозиториями и фабриками. Сам репозиторий вызовет интерфейс БД для получения набора результатов. Этот набор результатов затем будет передан factory, который будет понимать, что набор результатов воссоздает объект.
Что делать, если данные были иерархическими по своему характеру, вроде какой-то древовидной структуры. Например:
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;
}
}
Если я попытаюсь создать дочерние элементы в factory, мне нужен доступ к репо. Если я сделаю это в Repo, я чувствую, что делаю работу, которая должна быть для factory. Не знаете, как справиться с этим.
Я думал, что Foo не является совокупным корнем, а FooTree является совокупным корнем. Поэтому, пытаясь получить любой Foo, мне нужно будет создать все дерево, что означает, что я могу передать коллекцию объектов Foo в FooTreeFactory.
Любая помощь будет очень оценена.