Asp.net mvc 4依赖解析器

时间:2013-11-20 02:54:02

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

我是ASP.NET MVC 4的新手。我在ASP.NET MVC 4项目中使用了自定义依赖项解析器,以便使用依赖注入框架。

依赖项解析程序在ASP.NET MVC 4中的作用是什么?

2 个答案:

答案 0 :(得分:21)

它允许您从依赖注入实现中抽象出来。稍后,如果您决定从Unity切换到Windsor,您可以更轻松地完成,而无需重新编写大量代码

这意味着您可以使用此代码解析您的实例

DependencyResolver.Current.GetService<IMyController>();

答案 1 :(得分:0)

我使用Ninject

使用不同的方法
  1. 使用NuGet我下载了Ninject(只是没有对MVC进行任何特殊修改)。所以你将在参考文献中使用Ninject。
  2. 现在我创建了一个自定义控制器工厂类(从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);
        }
    }
    
  3. 让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));                       
    
        }
    }
    
  4. 所以现在当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非常容易,但这超出了问题的范围。