2013-01-03 84 views
9

我創建使用MVC 4最佳實踐的依賴注入

我想用Ninject設置依賴注入在ASP.net一個新的項目。但在開始設置依賴注入的最佳實踐之前,我需要做什麼?

目前我在webproject中有一個binder類設置,它將引用解決方案中的數據項目。

的粘合劑類,如下所示:

Public static class Binder 
{ 
    static Ninject.IKernel _kernel; 

    static Binder() 
    { 
     _kernel = new Ninject.StandardKernel(); 

     _kernel.Bind<IConfig>().To<AppSettingsConfig>(); 
     _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>(); 

    } 

    public static T GetImplementation<T>() 
    { 
     return _kernel.Get<T>(); 
    } 

} 

然後我的控制器內我使用GetImplementation方法來使用的確切需要依賴性,而不是所有註冊在應用程序啓動。從控制器

示例代碼:

Public ActionResult Get (int id) 
{ 
    var repository = Binder.GetImplementation<IDocuments>(); 

    // do some stuff with the repository here 
} 

不知道這將是一個很好的方法嗎?任何建議都會很好。

+4

一些代碼,將是一件好事呢? – BenjaminPaul

+1

@Wiktors下面的答案是要走的路。儘可能多地使用構造函數注入。如果出於某種原因,您無法設置完整的依賴關係鏈,請僅使用SL反模式。 –

回答

16

您現在擁有的是服務定位器反模式的示例。 Google已經多次討論過更多細節。

總之,而不是依賴於服務定位器

public class SomeController 
{ 
    public ActionResult Get (int id) 
    { 
     var repository = Binder.GetImplementation<IDocuments>(); 

     // do some stuff with the repository here 
    } 
} 

你應該把你的服務注入客戶端類(依靠構造器注入)

public class SomeController 
{ 
    private IDocuments documentService { get; set; }  

    public SomeController(IDocuments documentService) 
    { 
    this.documentService = documentService; 
    } 

    public ActionResult Get (int id) 
    { 
     var repository = documentService; 

     // do some stuff with the repository here 
    } 
} 

在這種特定的情況下,可以設置您的控制器工廠以使用您的IoC容器來解析您的控制器。

0

您已鏈接到控制器內的Binder類實例。它使得你的類不可重用,它必須被重構,因爲控制器不能獲得正確的IDocuments實現實例。 必須有一些外部依賴解析器(比如示例 - Ninject)必須進行構造函數注入或屬性注入。