2012-10-11 54 views
0

我正在嘗試使用Mvc的Web擴展的Dynamo IoC,並且我看到他們已經完成了創建自定義HttpApplication以從中派生Global.asax的出色工作。但是,似乎我錯過了一些東西。Dynamo IoC和Mvc

我想在我的控制器中完成DI,但我堅持使用通常的「控制器必須有無參數構造函數」的問題。

這是我在Global.asax中(從DynamoMvcAndWebApiApplication派生)做:

protected override void RegisterDependencies(Dynamo.Ioc.IIocContainer container) 
{ 
    container.Register<ILogger, FakeLogger>(); 
} 

然後我的控制器:

public class HomeController : Controller 
{ 
    private readonly ILogger logger; 

    public HomeController(ILogger logger) 
    { 
     this.logger = logger; 
    } 

    public ActionResult Index() 
    { 
     logger.Log("test"); 
     return View(); 
    } 
} 

這讓我 「無參數的構造函數錯誤」。我認爲迪納摩的網絡擴展已經照顧了使DI工作所需的任何東西。

如果我添加一個無參數的構造函數,它會被調用,但是然後我的ILogger將爲null,並且在我的action方法中會得到一個NullReferenceException異常。

我想過必須實現一個ControllerFactory,但我也認爲如果它是強制性的,他們會提供它與MVC的所有其他東西,所以我認爲我濫用提供的東西。

我想知道是否有人知道如何使DI在這種情況下工作。謝謝。

+0

我在我的手機上,或者這將是一個完整的答案,但看看在System.Web.Mvc的DependencyResolver類 – rossipedia

+0

感謝您的興趣,但自定義HttpApplication已經負責設置DependencyResolver與定製的一個與IoC容器一起提供。我的問題在於讓Controllers沒有無參數構造函數。 –

+0

這很奇怪。我當前的mvc項目中沒有任何控制器具有默認的構造函數,它們工作得很好。 – rossipedia

回答

-1

經過漫長的挖掘和試驗後,Dynamo似乎沒有完全與MVC集成。我試過Ninject與MVC的集成,並且它工作正常,開箱即用。

我的猜測是迪納摩只是「還沒有」,我會在將來繼續檢查它的更新。

1

我最好的猜測是,這是因爲您在註冊依賴項時沒有註冊HomeController。 根據你的例子,你沒有。

0

我同意MartinF。如果您希望您的HomeController的依賴關係得到解決,您需要通過從您的Dynamo容器解析它來實例化它。當然,我沒有看到你的解決方案代碼,但我只是猜測這是怎麼回事。我不認爲這是「Dynamo未完全與MVC集成」的問題。根據容器的工作方式,在嘗試解析容器之前,您甚至可能不需要向容器明確註冊HomeController,但是您需要讓容器爲您解決問題,以便它可以滿足依賴關係。只是我的猜測基於其他容器的使用情況。

+0

我很抱歉,但我不同意。只要看看Ninject MVC集成是如何完成的。您可以安裝它,並且它可以直接使用。我不必手動註冊每個添加到解決方案的控制器,ninject使用自己的控制器工廠和其他一切工作所需的MVC管道進行迭代。 –

+0

夠公平的。但是,使用Autofac可能會更好。它比Ninject速度更快,功能更豐富。只是我的兩分錢。 – NovaJoe