相关疑难解决方法(0)

值与实体对象(域驱动设计)

我刚开始阅读DDD.我无法完全掌握Entity vs Value对象的概念.有人可以解释当Value对象被设计为Entity对象时系统可能遇到的问题(可维护性,性能等等)吗?例子很棒......

domain-driven-design value-objects entityobject

83
推荐指数
5
解决办法
3万
查看次数

聚合根引用其他聚合根

我目前正在使用DDD工作很多,并且在从其他聚合根加载/操作聚合根时遇到问题.

对于我模型中的每个聚合根,我也有一个存储库.存储库负责处理根的持久性操作.

假设我有两个聚合根,包含一些成员(实体和值对象).

AggregateRoot1和AggregateRoot2.

AggregateRoot1有一个引用AggregateRoot2的实体成员.

  1. 当我加载AggregateRoot1时,我是否应该加载AggregateRoot2?
  2. AggregateRoot2的存储库是否应对此负责?
  3. 如果是这样,AggregateRoot1中的实体是否可以调用AggregateRoot2的存储库进行加载?

此外,当我在AggregateRoot1中的实体与AggregateRoot2之间创建关联时,是应该通过实体还是通过AggregateRoot2的存储库来完成?

希望我的问题有道理.

[编辑]

当前的解决方案

Twith2Sugars的帮助下,我提出了以下解决方案:

如问题中所述,聚合根可以具有引用其他根的子项.将root2分配给root1的其中一个成员时,root1的存储库将负责检测此更改,并将其委派给root2的存储库.

public void SomeMethod()
{
    AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
    root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
    AggregateRoot1Repository.Update(root1);
}

public class AggregateRoot1Repository
{
    public static void Update(AggregateRoot1 root1)
    {
        //Implement some mechanism to detect changes to referenced roots
        AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的例子,没有Demeter法或其他最佳原则/实践包括:-)

进一步评论赞赏.

domain-driven-design aggregate loading repository aggregateroot

27
推荐指数
2
解决办法
1万
查看次数

简单的聚合根和存储库

我是众多试图理解聚合根的概念之一,我认为我已经掌握了它!但是,当我开始为这个示例项目建模时,我很快陷入了两难境地.

我有两个实体ProcessTypeProcess.一个Process不能存在没有ProcessTypeProcessType拥有众多Process上课.所以一个进程持有一个类型的引用,没有它就不能存在.

那应该ProcessType是聚合根?通过调用创建新进程processType.AddProcess(new Process()); 但是,我有其他实体只持有Process对它的引用,并通过它访问它的类型Process.Type.在这种情况下,ProcessType首先没有任何意义.

但聚合之外的AFAIK实体仅允许保留对聚合根的引用,而不允许对聚合内的实体进行引用.那么这里有两个聚合,每个聚合都有自己的存储库吗?

domain-driven-design aggregate repository

5
推荐指数
2
解决办法
3234
查看次数