5

我剛開始設計DDD(我沒有經驗,沒有一位老師)爲DDD中的每個服務類提供一個接口是否是一種很好的設計實踐?

我有一些域服務類必須在某些時候引用對方。所以我決定通過構造函數注入引用。

當我創建了一個有很多數據在控制器來顯示我不得不創建一批服務(其中一些引用對方)

的在這一點上我的控制器的第一線一個視圖是這樣的:

 EmployeeRepository employRepository = new EmployeeRepository(); 
     ShiftModelRepository shiftModelRepository = new ShiftModelRepository(); 
     ShiftModelService shiftModelService = new ShiftModelService(shiftModelRepository); 
     EmployeeService employeeService = new EmployeeService(employRepository, shiftModelService); 
     OvertimeRepository overtimeRepository = new OvertimeRepository(); 
     OvertimeService overtimeService = new OvertimeService(overtimeRepository, employeeService); 

但我開始爲這些服務創建界面和使用IoC的控制器(名爲StructureMap)

現在同樣的控制器的第一行是這樣的:

 IShiftModelService shiftModelService = ObjectFactory.GetInstance<IShiftModelService>(); 
     IOvertimeService overtimeService = ObjectFactory.GetInstance<IOvertimeService>(); 
     IEmployeeService employeeService = ObjectFactory.GetInstance<IEmployeeService>(); 

我認爲它使用起來好得多,但我知道這是否是DDD的一個好習慣。

+3

的接口都不錯,但你應該看看人所以看看注射(特別是[構造函數注入](http://stackoverflow.com/questions/2531612/structuremap-resolve-dependency-through-injection-instead-of-service-location))而不是使用服務位置。 – StuartLC

+0

請閱讀我對Matt Whetton的回答 – jannagy02

回答

2

使用接口幾乎總是最好和良好做法 - 所以你必須在第二個例子是更好的。

但作爲StuartLC提到,你真的想看看注入這些依賴構造函數的參數。

ObjectFactory.GetInstance真是一種服務定位的是一般不使用的對象不申報哪些依賴它具有最佳的模式。通常將依賴關係作爲構造函數參數公開並更好地注入。

+0

我不確定我是否理解你的意思。 (我通過構造函數完成所有注入,並且StructureMap找到這些依賴關係)請在其他世界中告訴我。謝謝。 – jannagy02

+0

所以是的,你正在解決構造函數中的這些依賴關係,但你應該做的是讓它們作爲構造函數的參數。然後,創建該對象的類會將依賴關係注入到該對象中。 –

+0

不,我實際上將它們作爲構造函數的參數。當我稱之爲「IEmployeeService employeeService = ObjectFactory.GetInstance ();」 StructureMap使用所需的參數創建它。 EmployService的構造函數有兩個構造函數參數(IEmployRepository,IShiftModelService),並且沒有默認的構造函數。 – jannagy02

2

是的,在使用DI(依賴注入)框架時,可以使用每個實現的接口。

你應該避免ObjectFactory.GetInstance<IShiftModelService>(),讓你的框架解決依賴關係自動使用YourImplementationOfControllerFactory

我沒有使用結構映射在我的項目,但我一直在使用Castle Windsor,另外一個依賴注入框架。你也可以看看Ninject

不管怎樣,有類似的很多框架步驟:

  1. 寫控制器工廠的自定義實現 - 一類 繼承DefaultControllerFactory
  2. 註冊容器應該解析的類型。
  3. 引導容器Global.asax.cs
  4. Global.asax.cs中設置您的控制器工廠實例。

Global.asax。CS:

public class MvcApplication : System.Web.HttpApplication 
{  
    protected void Application_Start() 
    { 
     /* code that bootstraps your container */ 

     //Set the controller builder to use our custom controller factory 
     var controllerFactory = new YourControllerFactory(); 
     ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
    } 
} 

有幾個有用的鏈接:

相關問題