在我当前的项目中,我越来越多地采用 DDD / Onion 架构。我仍然不清楚的许多事情之一是应该有多少封装。用一个具体的例子更容易解释。
例子
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);
}
}
问题
对于一个实体的工厂,你,
- 期望调用者为您构造值对象并使用它来初始化 ComplexEntity?
- 基本上将 CLR 基本类型传递给工厂,然后构造构成实体的每个 ValueObject?
我倾向于选项 2,但我似乎无法找到支持它的文献。
编辑 1
老实说,我仍然没有更清楚。聚合根呢?
当我的实体引用其他实体时,例如下面。
- 我应该有一个
IComplexEntityFactory
,ILessComplexEntityFactory
?或者只是IComplexEntityAggregateFactory
创建 LessComplexEntity 并实例化 ComplexEntity ? - 在 AggregateFactory 解决方案的情况下,如果传递给工厂的 LessComplexEntity 属性对应于现有的 LessComplexEntity,我该怎么办?我是否从存储库中检索和重用它?还是我向调用者返回错误?
AggregateFactory 的方法签名是什么?会不会
(ValueObject a, ValueObject b)
,或者(ValueObject value, LessCompelxEntity entity)
公共类 ComplexEntity { 私有只读 int _id; 公共 int Id { 获取 { 返回 _id;} }
public ValueObject Value {get; set;} public LessComplexEntity Entity {get; set;} public ComplexEntity(int id, ValueObject value, LessComplexEntity entity) { }
}
公共类 LessComplexEntity { 私有只读 int _id; public int Id { get {return _id;} } public ValueObject Value {get; set;} public LessComplexEntity(int id,ValuObject 值){ } }