通过Controller Factory注入实例

时间:2014-08-19 18:34:53

标签: c# asp.net-mvc asp.net-mvc-4 dependency-injection

我正在研究依赖注入,我需要一些帮助才能更好地理解控制器工厂。

enter image description here

我需要在SqlReceitaRepository中通过Constructor Injection注入HomeController

HomeController构造函数

private readonly IReceitaRepository repositorio;

public HomeController(IReceitaRepository repositorio)
{
    if (repositorio == null)
       throw new ArgumentException("repositorio");

    this.repositorio = repositorio;
}

实现SqlReceitaRepository后,我现在可以设置ASP.NET MVC来注入 它的一个实例进入HomeController的实例,但我该怎么做呢?

明细:我使用NHibernate代替Entity Framework。

如果需要,为完成此操作而创建的类将属于哪个层?

我阅读了一些文章,我发现我需要在Global.asax

中添加一个新行

Global.asax中

var controllerFactory = new ReceitaControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

我假设ReceitaControllerFactory应包含IControllerFactory实施。

但是看IControllerFactory

public interface IControllerFactory
{
    IController CreateController(RequestContext requestContext, string controllerName);
    SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName);
    void ReleaseController(IController controller);
}

我们可以看到CreateController方法,但是如何将一个SqlReceitaRepository实例注入HomeController的实例?

1 个答案:

答案 0 :(得分:2)

简单的答案:

IController CreateController(RequestContext requestContext, string controllerName)
{
    return new HomeController(new SqlReceitaRepository());
}

但是,正如您可能已经注意到的,这只适用于编写的一种控制器类型。更重要的是,它不是很易于维护。所以正确的答案是获得像Ninject这样的流行DI框架,并获得框架所需的插件(例如Ninject MVC),然后定义绑定并让框架处理出了依赖关系:

Bind<IReceitaRepository>().To<SqlReceitaRepository>();