【发布时间】:2020-02-23 16:02:24
【问题描述】:
我不熟悉 DDD。 我检查了以下回复:Can a repository access another by DDD? 在询问之前,但找不到任何相关信息。
在我的应用程序中,我有一个包含另一个对象作为属性的对象。 我有一个主要对象的存储库,但是为了检索属性的值,需要访问另一个存储库。
我的问题是:第一个存储库应该访问第二个存储库,还是应用程序调用这两个存储库并将它们合并;
例如:
对于两个类:
public class Foo1
{
public int Id { get; set; }
// .... More data
public Foo2 foo2 { get; set; }
}
public class Foo2
{
public int Id { get; set; }
public int Type { get; set; }
}
代码应该是这样的:
public class Foo1Repository
{
public Foo1 Get() {
return new Foo1();
}
}
public class Foo2Repository
{
public Foo2 Get(int foo1Id)
{
return new Foo2();
}
}
public class Application
{
public void main()
{
Foo1 foo1 = new Foo1Repository().Get();
foo1.foo2 = new Foo2Repository().Get(foo1.Id);
}
}
或更多类似:
public class Foo1Repository
{
public Foo1 Get() {
Foo2Repository foo2Repository = new Foo2Repository();
Foo1 foo1 = new Foo1();
foo1.foo2 = foo2Repository.Get(foo1.Id);
return foo1;
}
}
public class Foo2Repository
{
public Foo2 Get(int foo1Id)
{
return new Foo2();
}
}
public class Application
{
public void main()
{
Foo1 foo1 = new Foo1Repository().Get();
}
}
当然,我很想知道是否有更好的架构?
谢谢!
【问题讨论】:
-
这个问题可能更适合Software Engineering堆栈交换(并得到更好的回应)
-
@AvrahamL 我认为您不需要 Foo2 的特定存储库。在我看来,您可以简单地在 Foo1 的存储库上创建一个方法来检索此类属性,因为它是 Foo1 域的一部分
-
@Padro,感谢您的回复。问题是 Foo2 可以从系统的其他部分单独调用。这意味着它是一个业务部门。此外,这种和平信息存储在另一个提供程序中,如 Foo1。鉴于此,您仍然认为它们属于同一个存储库吗?
-
@AvrahamL 根据您的描述,
Foo2似乎具有聚合根 的特征,因此需要自己的存储库。然而,Foo1实体不能直接引用Foo2,方法是保存Foo2类型的字段。而Foo1必须只为Foo2的标识符 保存一个字段。我的回答中的第二种情况进一步解释了。
标签: c# .net domain-driven-design