gpt4 book ai didi

c# - DDD 和持久性。再次

转载 作者:太空狗 更新时间:2023-10-30 00:24:00 28 4
gpt4 key购买 nike

我在领域驱动设计中苦苦挣扎。据我所知,域模型永远不应该是持久感知的。假设我正在构建一个简单的待办事项列表应用程序。我有一个具有以下界面的任务:

interface ITask
{
bool IsCompleted {get;}
string Description {get;}

void Complete();
void ChangeDescription(string description);
}

通用的实现应该是这样的:

class SimpleTask : ITask
{
public SimpleTask(string description)
{
ChangeDescription(description);
}

public bool IsCompleted { get; private set; }
public string Description { get; private set; }

public void Complete()
{
IsCompleted = true;
}

public void ChangeDescription(string description)
{
// some validation here
// ...
Description = description;
}
}

我希望有一个必要的描述 - 因为它是一个业务规则。所以从这一刻起,如果我想通过序列化程序保存这个对象,我将失败,因为没有提供无参数构造函数。而且我不应该提供它,因为没有持久性感知规则。如果我以 DTO\POCO 的形式对我的任务建模,我最终会遇到另一个问题——所谓的贫血模型。此外,我不想为某些属性提供 setter 。

那么所有这些的解决方案在哪里?我可以创建一个知道如何保存和恢复任务状态的紧耦合保护程序。但是我只能访问公共(public)属性和方法,如果任务的内部逻辑很复杂并且无法保存\恢复怎么办?我是否应该在任务内部标记所有字段并有可能保存对象的内部状态?这不是有点代码味道并且违反了无持久性感知规则吗?

你是如何解决这个问题的?

最佳答案

据我了解,Entity Framework 的灵 active 远低于 Hibernate,因此您必须在模型中做出更多妥协。 Vaughn Vernon,《实现领域驱动设计》(IDDD) 的作者 shows a great way保留自封装实体,同时使用 Entity Framework 轻松保留它们的状态。

如果您可以使用您选择的持久性存储,您也可以使用 different strategy这不涉及太多的阻抗失配。

关于c# - DDD 和持久性。再次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31108529/

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