我见过很多这样的问题,但它们似乎总是与我的想法不符。我认为这是由于我对聚合-聚合根-实体-值对象之间的关系的理解草率。
完成的解决方案对我来说就像 DTO,因为一切(所有逻辑)似乎最终都在存储库中。也许我一直在看 EF 教程太多。
假设我们有一个非常简单的类,带有第一个版本的 repo(让我们忽略它只处理一个人):
class Person
{
int Age;
void MakeOlder() { Age++; }
}
interface IPersonRepository
{
Person GetAPerson();
}
现在,我想从 UI 中(例如,按下按钮)做的不是:
person.MakeOlder();
_repo.Save(person);
但也许只是:
person.MakeOlder();
对我来说,“MakeOlder”的动作应该触发保存。但这当然需要在 Person 中引用 repo。我能想到的唯一选择是:
_repo.MakePersonOlder(person);
(看起来很糟糕。)
person.MakeOlder(_repo);
(UI pov 没有任何好处,这就是我现在正在查看的内容)
class Person : IMyEntityBaseType { ...
void MakeOlder() {
Age++;
EntityDataWasChangedNowIWantToBeSaved();
}
}
或者这个的一些变体;事件、AOP 等。以某种方式发出或捕获应该完成保存的信号。
我想我也可能将我对 DDD 的看法与事件溯源和类似概念混为一谈。
我认为SavePerson
UI 代码中的调用感觉很脏,这是完全错误的吗?
什么是“正确”的做法?