【发布时间】:2012-07-08 20:24:26
【问题描述】:
我在当前的项目中越来越多地采用 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; 公共 int Id { 获取 {return _id;} } 公共值对象值 {get;放;} 公共 LessComplexEntity(int id,ValuObject 值) { } }
【问题讨论】:
-
我会选择#1,如果您必须通过例如,那将非常乏味。否则,一个采购订单的多个地址 vo。 CreatePurchaseOrder( otherArgs , ShippingAddress, BillingAddress ...)
-
@RogerAlsing 但是我不明白工厂的好处。它所要做的只是调用 ComplexEntity 的构造函数,而不是创建构成它的所有子组件。
-
它与语义 IMO、OrderFactory.CreateVIPCustomerOrder、OrderFactory.CreateAnonymousCustomerOrder 等有关。根据上下文不同地初始化聚合根......它不应该只是另一层间接。工厂方法的参数可能比 AR 构造函数少很多,反之亦然
-
@RogerAlsing 谢谢你说得通
标签: c# domain-driven-design factory onion-architecture