gpt4 book ai didi

c# - DDD 工厂实体值对象

转载 作者:太空狗 更新时间:2023-10-30 01:23:23 25 4
gpt4 key购买 nike

我在当前项目中越来越多地采用 DDD/洋葱架构。我仍然不清楚的许多事情之一是应该有多少封装。用一个具体的例子更容易解释。

示例

namespace MyProject.Model
{
public class ComplexEntity
{
private int _id;
public int Id { get {return _id;} }
public ValueObjectA ValueA {get; set;}
public bool IsBool {get; set;}
public ComplexEntity(ValueObjectA a, bool isBool)
{
// Do some validation first
ValueA = a;
ValueB = b;
IsBool = isBool;
}
}

public class ValueObjectA
{
public bool IsBoolA {get; private set;}
public bool IsBoolB {get; private set;}
public ValueObjectA(bool a, bool b)
{
IsBoolA = a;
IsBoolB = b;
}
}

public Interface IComplextEntityFactory
{
// Option 1
ComplexEntity Create(
ValueObjectA a,
bool IsBool);

// Option 2
ComplexEntity Create(
bool valueABool a,
bool valueBBool b,
bool isBool);
}
}

问题

对于一个实体的工厂,你呢,

  1. 希望调用者为您构建值对象并使用它来初始化 ComplexEntity?
  2. 是否基本上将 CLR 基本类型传递给工厂,然后构造构成实体的每个 ValueObject?

我倾向于选项 2,但我似乎找不到支持它的文献。

编辑 1

老实说我还是不太清楚。聚合根呢?

当我的实体引用其他实体时,例如下面。

  1. 我应该有一个 IComplexEntityFactoryILessComplexEntityFactory 吗?或者只是一个创建 LessComplexEntity 并实例化 ComplexEntity 的 IComplexEntityAggregateFactory
  2. 对于 AggregateFactory 解决方案,如果传递给工厂的 LessComplexEntity 属性对应于现有的 LessComplexEntity,我该怎么办?我是否从存储库中检索并重用它?还是向调用者返回错误?
  3. AggregateFactory 的方法签名是什么?是 (ValueObject a, ValueObject b) 还是 (ValueObject value, LessCompelxEntity entity)

    公共(public)类 ComplexEntity{ 私有(private)只读 int _id; public int Id { get { return _id;} }

    public ValueObject Value {get; set;}
    public LessComplexEntity Entity {get; set;}

    public ComplexEntity(int id, ValueObject value, LessComplexEntity entity)
    {
    }

    公共(public)类 LessComplexEntity{ 私有(private)只读 int _id; public int Id { get {return _id;} } 公共(public) ValueObject 值 {get;放;} public LessComplexEntity(int id, ValuObject 值) { }

最佳答案

我会选择选项 1。

  • 向所有人明确表示您需要 ValueObjectA 来构建 ComplexEntity。当您看到某处使用的方法时,可读性更强,头疼更少。

  • 如果 ValueObjectA 发生变化,您只需在一个地方(工厂的调用方)修改代码,而不是更改 Create() 的签名 + 调整工厂内的值对象创建。

  • 工厂的 Create() 方法的参数越少,越不冗长且可读性越高。

  • 在单元测试中,它为您提供了更多选项以便能够注入(inject)您想要的 ValueObjectA。如果将 ValueObjectA 的创建完全隐藏在工厂内部,那么在测试方面您无能为力。

[编辑]

目前尚不清楚聚合根和工厂的真正问题是什么,但您不应将检索/重新水合现有对象的责任与创建对象的责任混为一谈。

我认为工厂的工作是从较小的部分组装一个新对象(无论它们是原始类型、值对象、实体...)作为一般规则

工厂应提供所有这些部件,工厂没有义务从某处取回或再水化它们。您可以将其留给工厂的来电者。这将使工厂更加cohesive并耦合到较少的类(存储库等)

关于c# - DDD 工厂实体值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395031/

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