2013-08-01 23 views
1

這個問題是我上週末發佈的this問題的一個後續問題。如何從用戶界面/服務層抽象我的DI工具

截至目前,我在我的服務層有這樣的事情,在MVC應用程序中與UI交談。

IDepartmentService deptService = kernel.Get<IDepartmentService>(); 
IList<Department> deptList = deptService.GetAllDepartments(); 

一切都很好,DI按預期工作。但是,由於某種原因,如果我決定使用Structuremap,則需要更改整個服務層。我如何將其抽象出來,以便DI工具的更改不會影響我的服務層或影響最小。

回答

2

但是,由於某種原因,如果我決定使用Structuremap,那麼我的 整個服務層需要更改。

這是不正確的。如前面的線程所示,服務層對DI框架沒有任何瞭解。

您應該有一個名爲composition root的圖層。這是知道DI框架和所有底層的唯一層。這是你在做作文的地方。因此,如果您更改了DI框架,則唯一需要進行更改的地方是組合根。

所以你應該絕對擺脫你的服務呼叫kernel.Get<>。現在您正在使用服務定位器而不是依賴注入。服務定位器是一種反模式。您的服務層應該是這樣的:的

public class MyService 
{ 
    private readonly ISomeDependency dependency; 
    public MyService(ISomeDependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void SomeMethod() 
    { 
     // do something with the dependency here 
    } 
} 

代替:

public class MyService 
{ 
    private readonly ISomeDependency dependency; 
    public MyService() 
    { 
     this.dependency = kernel.Get<ISomeDependency>(); 
    } 

    public void SomeMethod() 
    { 
     // do something with the dependency here 
    } 
} 
+0

你的第一個代碼塊正是我在我的服務層。但是,如果我只需要MyService類的多個方法中的一個方法來獲取數據,需要ISomeAnotherDependency的實例呢?我應該把它放在構造函數中嗎?這就是爲什麼我現在有kernel.Get <>方法,以便我可以獲得ISomeAnotherDependency的實例。我想擺脫它,因此想到一些ILocator.Get 這將給我一個所需類型的實例。你認爲這是一個不好的方法嗎? – NoobDeveloper

+1

是的,將它作爲構造函數依賴關係傳遞。構造函數注入用於將依賴關係傳遞給沒有它的類,該類無法正常工作。就你而言,即使你只有1個方法需要這種依賴關係,它仍然是服務正常工作所需的依賴關係。也不要使用服務定位器模式。這是一個反模式。您只能在組合根中使用DI框架。 –

+0

完美。再次感謝。我已將您的答覆標記爲答案。還有一個問題。我如何測試我的服務層?我應該手動新建的依賴關係傳遞給構造函數並測試服務層方法? – NoobDeveloper