Я занимаюсь разработкой проектов под управлением домена Эриком Эвансом, где он описывает взаимодействие между репозиториями и фабриками. Сам репозиторий вызовет интерфейс БД для получения набора результатов. Этот набор результатов затем будет передан на фабрику, которая будет понимать, что набор результатов воссоздает объект.Хранилища, фабрики и иерархически структурированные данные
Что делать, если данные были иерархическими по своему характеру, вроде какой-то древовидной структуры. Например:
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;
}
}
Если я пытаюсь построить детей на заводе-изготовителе, то я снова нужен доступ к репо. Если я сделаю это в Repo, я чувствую, что делаю работу, которая должна быть на заводе. Не знаете, как справиться с этим.
Одна мысль, что у меня есть, что Foo не является совокупным корнем, а FooTree является совокупным корнем. Поэтому, пытаясь получить любой Foo, мне нужно будет создать все дерево, а это значит, что я могу передать коллекцию объектов Foo в FooTreeFactory.
Любая помощь будет очень признательна.
Получить метод можно построить Foo и все связанные с детьми, Вы должны загрузить все запрошенные записи из БД в SQL-запросе и в общем виде создают ваше дерево (у вас есть все необходимые данные, например ParentId, ChildId и для создания вашего дерева); Вам не нужно разговаривать здесь с вашими репозиториями или любым другим слоем, кроме бэкэнда! –
Можете ли вы, возможно, разработать и сделать это в форме ответа. Затем я могу отметить вас как принятый ответ, если он лучше всего подходит. – uriDium