我是ASP.NET MVC 4的新手。我在ASP.NET MVC 4项目中使用了自定义依赖项解析器,以便使用依赖注入框架。
依赖项解析程序在ASP.NET MVC 4中的作用是什么?
答案 0 :(得分:21)
它允许您从依赖注入实现中抽象出来。稍后,如果您决定从Unity切换到Windsor,您可以更轻松地完成,而无需重新编写大量代码
这意味着您可以使用此代码解析您的实例
DependencyResolver.Current.GetService<IMyController>();
答案 1 :(得分:0)
我使用Ninject
使用不同的方法现在我创建了一个自定义控制器工厂类(从DefaultControllerFactory派生的类)。我的目标是让MVC在尝试创建控制器对象时使用我的控制器工厂。
public class NinjectControllerFactory : DefaultControllerFactory
{
#region Member Variables
private IKernel ninjectKernel = null;
#endregion
public NinjectControllerFactory(IKernel kernel)
{
this.ninjectKernel = kernel;
AddBindings();
}
private void AddBindings()
{
//BO
ninjectKernel.Bind<IAuthenticationBO>().To<AuthenticationBO>();
//DAO
ninjectKernel.Bind<ISharedDAO>().To<SharedDAO>();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
}
}
让MVC使用我的自定义控制器工厂。在Application_Start()
中的Global.asax中public class MvcApplication : System.Web.HttpApplication
{
private IKernel kernel = new StandardKernel();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//register a cutom controller factory
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(kernel));
}
}
所以现在当MVC创建控制器对象时,它使用我们的自定义控制器工厂,如您所见,它使用Ninject解析所有依赖项。
例如
public class MainController : Controller
{
#region Member Variables
private IAuthenticationBO authentication = null;
#endregion
public MainController(IAuthenticationBO authentication)
{
this.authentication = authentication;
}
}
Ninject注入了IAuthenticationBO的实现(在我们的例子中是AuthenticationBO),我们可以使用它。此外,使用模拟和TDD非常容易,但这超出了问题的范围。