2012-10-11 49 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