2009-08-27 119 views
14

構造函數依賴注入考慮:在ASP.NET MVC控制器

public class HomeController : Controller 
{ 
    private IDependency dependency; 

    public HomeController(IDependency dependency) 
    { 
     this.dependency = dependency; 
    } 
} 

而事實上,在ASP.NET MVC控制器必須有一個空的默認構造函數有什麼辦法不是定義一個空其他(無用在我看來)DI的構造函數?

回答

8

如果你想擁有你必須定義一個定製的控制器工廠參數構造函數。關於這個問題,菲爾·哈克有一個很棒的blog post

如果你不希望推出自己的控制器工廠,你可以得到在CodePlex上/ GitHub上的ASP.NET MVC Contrib項目他們預先製作。

7

你不必有空的構造函數,如果你建立一個自定義的ControllerFactory使用像NinjectAutoFacCastle Windsor,等大多數它們的依賴注入框架具有代碼爲CustomControllerFactory用自己的容器,你可以重用。

的問題是,默認的控制器工廠不懂得繞道的依賴。如果你不想使用框架上面提到的,你可以做什麼是所謂窮人的依賴注入:

public class HomeController : Controller 
{ 

    private IDependency iDependency; 

    public HomeController() : this(new Dependency()) 
    { 
    } 

    public HomeController(IDependency iDependency) 
    { 
     this.iDependency = iDependency; 
    } 
} 
1

您可以通過屬性注入你的依賴,例如參見:Injection by Property 使用Ninject看起來是這樣的:

[Inject] 
public IDependency YourDependency { get; set; }