gpt4 book ai didi

c# - 存储库、工厂和层次结构数据

转载 作者:可可西里 更新时间:2023-11-01 09:08:58 24 4
gpt4 key购买 nike

我正在阅读 Eric Evans 的领域驱动设计,他在其中概述了存储库和工厂之间的相互作用。存储库本身将调用数据库接口(interface)来获取结果集。然后将此结果集传递给工厂,该工厂将理解该结果集以重构对象。

如果数据本质上是分层的,比如某种树结构,那会怎样。例如:

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 我将拥有我的接口(interface)和实现:

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;
}
}

如果我尝试在工厂中构建 child ,那么我需要再次访问存储库。如果我在 Repo 中这样做,我觉得我正在做本应为工厂服务的工作。不确定如何解决这个问题。

我的一个想法是 Foo 不是聚合根,而是 FooTree 是聚合根。因此,为了获取任何 Foo,我需要创建整棵树,这意味着我可以将 Foo 对象的集合传递给 FooTreeFactory。

如有任何帮助,我们将不胜感激。

最佳答案

存储库处理聚合根,而不是实体。因此,我建议您使用 FooTree AR 解决方案并从数据库中检索它。工厂不应该依赖于存储库,因此您必须获取所有树数据并将它们传递给工厂。或者,您可以在 AR 客户端(或 AR 本身)请求它们时实现 ORM 的延迟加载和“延迟加载”子项之类的东西。

关于c# - 存储库、工厂和层次结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20424030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com