2009-01-07 52 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個入口。

相關問題