14

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

ASP.NET MVC 4 中依赖解析器的作用是什么?

4

2 回答 2

23

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

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

DependencyResolver.Current.GetService<IMyController>();
于 2013-11-20T02:58:43.590 回答
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));                       
    
        }
    }
    

因此,现在当 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 也很容易,但这超出了问题的范围。

于 2013-11-20T03:23:26.550 回答