我正在研究依赖注入,我需要一些帮助才能更好地理解控制器工厂。
我需要在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的实例?
答案 0 :(得分:2)
简单的答案:
IController CreateController(RequestContext requestContext, string controllerName)
{
return new HomeController(new SqlReceitaRepository());
}
但是,正如您可能已经注意到的,这只适用于编写的一种控制器类型。更重要的是,它不是很易于维护。所以正确的答案是获得像Ninject这样的流行DI框架,并获得框架所需的插件(例如Ninject MVC),然后定义绑定并让框架处理出了依赖关系:
Bind<IReceitaRepository>().To<SqlReceitaRepository>();