控制器的依赖注入(使用Ninject)

本文详细介绍了如何使用Ninject在ASP.NET MVC应用中实现依赖注入,包括通过默认的Controller Factory、自定义Controller Activator以及自定义Dependency Resolver等三种主要方式,并提供了具体的实现代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Ninject.Injection;
using Ninject;
using WebApplication1.Models;

namespace WebApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //控制器注入有3种方式
            /*
             1.通过默认的Controller
                //NinJectControllerFactory nc = new NinJectControllerFactory();
                //nc.Register<IPersonRepertory, PersonRepertory>();
                //ControllerBuilder.Current.SetControllerFactory(nc);
             2.通过自定义ControllerActivator
                NinJectActivator na = new NinJectActivator();
                na.Register<IPersonRepertory, PersonRepertory>();
                ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(na));
             3.通过自定义IDepencyResolever
                NinJectDepencyResolever nj = new NinJectDepencyResolever();
                nj.Register<IPersonRepertory, PersonRepertory>();
                DependencyResolver.SetResolver(nj);
             */
        }
    }


    public class NinJectControllerFactory : DefaultControllerFactory
    {
        public IKernel Kernel { get; set; }
        public NinJectControllerFactory()
        {
            this.Kernel = new StandardKernel();
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            return (IController)this.Kernel.TryGet(controllerType);
        }
        public void Register<TForm, TTo>() where TTo : TForm
        {
            this.Kernel.Bind<TForm>().To<TTo>();
        }
    }
    public class NinJectActivator : IControllerActivator
    {
        public IKernel Kernel { get; set; }
        public NinJectActivator()
        {
            this.Kernel = new StandardKernel();
        }
        public void Register<TForm, TTo>() where TTo : TForm
        {
            this.Kernel.Bind<TForm>().To<TTo>();
        }
        public IController Create(RequestContext requestContext, Type controllerType)
        {
            return (IController)this.Kernel.TryGet(controllerType);
        }
    }


    public class NinJectDepencyResolever : IDependencyResolver
    {
        private IKernel kernel;
        public NinJectDepencyResolever()
        {
            kernel = new StandardKernel();
        }
        public object GetService(Type serviceType)
        {
           return kernel.TryGet(serviceType);
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
          return  kernel.GetAll(serviceType);
        }
        public void Register<TForm, TTo>() where TTo : TForm
        {
            this.kernel.Bind<TForm>().To<TTo>();
        }
    }
    //public class Temp : IControllerActivator
    //{
    //    public IController Create(RequestContext requestContext, Type controllerType)
    //    {
    //        return null;
    //    }
    //}
}

 

转载于:https://www.cnblogs.com/student-note/p/7904663.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值