【发布时间】:2015-07-30 02:10:01
【问题描述】:
我无法理解如何正确设计我的域对象。我一直在努力解决的问题是如何用数据填充我的域对象。我发现的例子对于真正帮助我来说是微不足道的。我尝试了多种方法,但我不喜欢其中任何一种。假设您有大量数据需要传递给您的班级,因此您将其捆绑在 POCO 中。
我的第一个方向(将数据传入构造函数):
public class MyClass
{
private readonly ICalculator _calculator;
private readonly MyClassDataPOCO _data;
public MyClass(ICalculator _calculator, MyClassDataPOCO data)
{
this._calculator = _calculator;
_data = data
这效果不好,因为你的 IOC 容器不能自动初始化你的类。
第二方向(将数据传递到操作中):
public class MyClass
{
private readonly ICalculator _calculator;
public MyClass(ICalculator _calculator)
{
this._calculator = _calculator;
}
public decimal CalculateComplicatedValue1(MyClassDataPOCO data)
{
}
public decimal CalculateComplicatedValue2(MyClassDataPOCO data)
{
}
由于各种原因我不喜欢这个
- 您的类只不过是实例函数(不是真正的类)。他们只有行为,没有数据。
- 您委托您的客户处理您的数据。似乎不是一个聪明的主意。我相信你最终会遇到变异状态问题。
第三方向(只允许您通过静态工厂方法创建类):
public class MyClass
{
private readonly ICalculator _calculator;
private MyClassDataPOCO _data;
private MyClass(ICalculator _calculator)
{
this._calculator = _calculator;
}
public static MyClass Create(MyClassDataPOCO data)
{
return Create(_container.GetInstance<ICalculator>(), data);
}
public static MyClass Create(ICalculator calculator, MyClassDataPOCO data)
{
//do some input validation here
var myReturn = new MyClass(calculator);
myReturn._data = data;
return myReturn;
}
我猜在所有选项中我最喜欢这个。我唯一不喜欢的是必须有两个创建函数,这样才能进行单元测试(这样我就可以注入 ICalculator)。
我没有尝试的唯一选择是属性注入,因为 id 认为通过属性注入数据不是一个好主意。
【问题讨论】:
-
自动映射器适合您的情况吗?这样您就可以将数据填充逻辑封装在映射器分析器中或通过 ioc 作为依赖项注入,如果不适合您,我想知道为什么
-
@ming 我不是 100% 明白你在这里得到什么。我从未使用过自动映射器,但我认为我了解基本概念(从一种数据类型转换为另一种数据类型)。这对我有什么帮助?
标签: c# architecture domain-driven-design