2009-01-07 30 views
0

在域驱动设计中,使用工厂在您的域图层中创建域对象似乎是一种很好的做法(与使用直接构造函数或IOC)。在模型视图中使用演示者中的工厂模型视图演示者和域驱动设计项目

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

下面是一个示例,假设我有一个配置域对象,它具有许多小数设置。

公共类配置:PersistantObject {

public decimal temperature {get;set;} 

...(times 20) 

public decimal gravity {get;set;} 

}

为了在域中层创建该对象,而不是演示层,我将不得不通过每个这些十进制值的作为功​​能参数。创建一个笨拙的函数定义和调用。

ie ConfigurationService.CreateConfiguration(temperature,...(x20),gravity);

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

Configuration config = ConfigurationFactory.CreateNewConfiguration();

config.temperature = temperature;

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

config.gravity = gravity;

ConfigurationService.SaveNewConfiguration(config);

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

谢谢!

回答

2

我建议不要让域对象离开域层并进入表示层。将表示层集中在演示文稿上。

因此,我构建了数据传输对象以将数据混合到域和表示层。在你的情况下,让对话填充一个传递给你的服务并转换成相应域对象的DTO。但是,您不希望每次都从DTO构建域对象。 Consider the case where a DTO represents only a subset of a domain object。从这样一个DTO重新构建现有的域对象会给你一个局部域对象。你可能想要维护一个轻量级缓存来保存完整的域对象,这样你可以做一个适当的更新。

实质上,如果您应用Introduce Parameter Object重构,您将达到DTO解决方案。

0

有我会处理两个主要方面,这

1)如果这是通过设置一个对话框,我将创建执行命令模式类并绑定相关的对象的对话框。例如CmdCreateConfigurationService和CmdEditConfigurationService。

CmdCreateConfigurationService将依赖工厂类和最少的参数来选择正确的配置服务。

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

不管数据结构如何,您都会在命令对象中完成填写Configuration Service的工作。通过让非对话/窗体/屏幕对象实现IConfigurationServiceEditor,您可以自动执行测试,并且在某些情况下可以使复杂对象的配置变得更简单。

我为CAD/CAM软件开发了这种方法,它有几十个参数形状,每个参数形状有4到40个入口。

相关问题