web-dev-qa-db-ja.com

Asp.net mvc4依存関係リゾルバー

ASP.NET MVC 4を初めて使用します。依存性注入フレームワークを使用するために、ASP.NET MVC4プロジェクトでカスタム依存性リゾルバーを使用しました。

ASP.NET MVC 4での依存関係リゾルバーの役割は何ですか?

14
Aslam Jiffry

これにより、依存性注入の実装から抽象化することができます。後でUnityからWindsorに切り替えることにした場合、多くのコードを書き直すことなく、はるかに簡単に切り替えることができます。

これは、このコードを使用してインスタンスを解決できることを意味します

DependencyResolver.Current.GetService<IMyController>();
23
evhen14

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の使用は非常に簡単ですが、質問の範囲を超えています。

0
Anton