我看到了很多这样的问题,但它们总是似乎与我的想法不符。我认为这是由于我对聚合-聚合根-实体-值对象之间关系的理解不够清晰。
对我来说,最终的解决方案看起来就像DTOs,因为所有逻辑似乎都在存储库中结束。也许我看了太多EF教程。
假设我们有一个非常简单的类,带有第一个版本的repo(让我们忽略它只处理一个人的事实):
但也许只需要:
(似乎很糟糕。)
或者某种变体;事件、AOP等等。以某种方式发出或捕获信号,表明应该进行保存。
我认为我可能把我的DDD观点和事件溯源等概念混淆了。
如果在UI代码中调用
做正确的事情是什么?
对我来说,最终的解决方案看起来就像DTOs,因为所有逻辑似乎都在存储库中结束。也许我看了太多EF教程。
假设我们有一个非常简单的类,带有第一个版本的repo(让我们忽略它只处理一个人的事实):
class Person
{
int Age;
void MakeOlder() { Age++; }
}
interface IPersonRepository
{
Person GetAPerson();
}
现在,我想要从UI(比如,按下一个按钮)来做的事情不是:
person.MakeOlder();
_repo.Save(person);
但也许只需要:
person.MakeOlder();
对我来说,“变老”这个动作应该触发保存。但是这需要在Person中引用repo。 我能想到的唯一解决方案是:
_repo.MakePersonOlder(person);
(似乎很糟糕。)
person.MakeOlder(_repo);
就用户界面而言,我现在看到的没有任何收益。
class Person : IMyEntityBaseType { ...
void MakeOlder() {
Age++;
EntityDataWasChangedNowIWantToBeSaved();
}
}
或者某种变体;事件、AOP等等。以某种方式发出或捕获信号,表明应该进行保存。
我认为我可能把我的DDD观点和事件溯源等概念混淆了。
如果在UI代码中调用
SavePerson
感觉不好,那么我的想法完全错误吗?做正确的事情是什么?