在域驱动设计中,使用工厂在域层中创建域对象似乎是一种很好的做法(而不是使用直接构造函数或IoC)。

但是在presenter层中使用域对象工厂呢?例如,假设我是从从演示者处获得的用户输入创建域对象。

这是一个例子,假设我有一个具有多个小数设置的配置域对象。

public class Configuration:PersistantObject {

 public decimal temperature {get;set;}

 ...(times 20)

 public decimal gravity {get;set;}

}

为了在域层而不是presenter层中创建此对象,我必须将每个这些十进制值作为函数参数传递。创建一个笨拙的函数定义并调用。

即ConfigurationService.CreateConfiguration(温度,...(x20),重力);

也许更好的解决方案是在presenter层中创建Configuration对象,并直接从用户输入分配配置对象的所有值,跳过冗长的函数调用。

配置config = ConfigurationFactory.CreateNewConfiguration();

config.temperature = temperature;

..(x20).. = ...;

config.gravity = gravity;

ConfigurationService.SaveNewConfiguration(配置);

但我想知道这种方法是否错误,为什么? 如果这两种方法都是错误的,那么从用户输入创建冗长对象的最佳方法是什么?为什么?

谢谢!

有帮助吗?

解决方案

我建议不要让您的域对象超出域层并进入表示层。保持表达层专注于演示。

出于这个原因,我构建了数据传输对象,以便在域和表示层之间移植数据。在您的情况下,让对话框填充传递给您的服务并转换为相应域对象的DTO。

但是,您不希望每次都从DTO构造域对象。 考虑DTO仅表示域对象的子集的情况。从这样的DTO重构现有域对象将为您提供部分域对象。您可能希望维护一个包含完整域对象的轻量级缓存,以便您可以进行适当的更新。

基本上,如果您应用了介绍参数对象

,那么您就可以使用DTO解决方案了。 a>重构。

其他提示

我有两种主要方式来处理这个

1)如果通过对话框设置,我将创建实现命令模式的类,并将对话框与相关对象绑定。例如CmdCreateConfigurationService和CmdEditConfigurationService。

CmdCreateConfigurationService将依赖于选择正确的配置服务所需的工厂类和最小参数。

您设置了IConfigurationServiceEditor接口,并将其作为参数之一传递给CmdEditConfiguration参数。使用IConfigurationServiceEditor接口,您可以根据需要定义尽可能多的方法,以便尽可能轻松,轻松地从对话框传输信息。我建议使用一组键和值。命令对象知道如何从此集合中设置配置服务。 Dialog在设置时知道期待这个集合。

无论数据结构如何,您都将完成在命令对象中填写配置服务的工作。通过使非对话框/表单/屏幕对象实现IConfigurationServiceEditor,您可以自动执行测试,并在某些情况下使复杂对象的配置更加简单。

我为CAD / CAM软件开发了这种方法,该软件具有数十种参数形状,每种形状具有4到40个条目。

scroll top