MVC三个IOC注入点之Ninject使用示例

http://www.cnblogs.com/Raoh/archive/2013/03/27/AspNetMvc_IOC.html

群里一个技术大牛说MVC有三个注入点,但我只会一个DefaultControllerFactory。 在群友的帮助下,我大致了解了下:

IControllerFactory=>IDependencyResolver=>IControllerActivator 

这三者的关系如下:

MVC三个IOC注入点之Ninject使用示例

其实从上面的关系可以看出来这三个注入点,相互都存在依赖关系。 我们还是老规矩上代码:

1.IControllerFactory 注入:

    public class NInjectFactory:DefaultControllerFactory

    {

        private IKernel _iKernel;

        public NInjectFactory(IKernel ikernel)

        {

            this._iKernel = ikernel;

            AddBindHelper();

        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)

        {

            return controllerType == null ? null : (IController)_iKernel.Get(controllerType);

        }





        public void AddBindHelper()

        {



            _iKernel.Bind(typeof(IProduct)).To(typeof(ProductService));

        }

    }

2.IControllerActivator 注入:

    public class NinjectTwoControlActivator : IControllerActivator  

    {

        private IKernel _ikernel;

        public NinjectTwoControlActivator(IKernel ikernel)

        {

            this._ikernel = ikernel;

            AddBindHelper();

        }



        public IController Create(RequestContext requestContext, Type controllerType)

        {

            return controllerType == null ? null : (IController)_ikernel.Get(controllerType);

        }



        public void AddBindHelper()

        {

            _ikernel.Bind(typeof(IProduct)).To(typeof(ProductService));

        }

        

    }

3.IDependencyResolver注入:

    public class NinjectThreeCotrolResolver:IDependencyResolver

    {

        private IKernel _ikernel;

        public NinjectThreeCotrolResolver(IKernel ikernel)

        {

            this._ikernel = ikernel;

            AddBindHelper();

        }



        #region IDependencyResolver Members



        public object GetService(Type serviceType)

        {

            try

            {

                return _ikernel.Get(serviceType);

            }

            catch

            {

                return null;

            }

        }



        public IEnumerable<object> GetServices(Type serviceType)

        {

            return Enumerable.Empty<object>();

        }



        #endregion



        public void AddBindHelper()

        {

            _ikernel.Bind(typeof(IProduct)).To(typeof(ProductService));

        }

    }

三个在Global.asax的绑定到全局代码如下:

        protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();



            //ControllerBuilder.Current.SetControllerFactory(new NInjectFactory(new Ninject.StandardKernel()));//注册Ninject Ioc



            //var factory = new DefaultControllerFactory(new NinjectTwoControlActivator(new Ninject.StandardKernel()));

            //ControllerBuilder.Current.SetControllerFactory(factory);



            var dependencyResolver = new NinjectThreeCotrolResolver(new Ninject.StandardKernel());

            DependencyResolver.SetResolver(dependencyResolver);

            WebApiConfig.Register(GlobalConfiguration.Configuration);

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);

        }


前端控制器实现方式统一如下:

    public class HomeController : Controller

    {

        private IProduct _iproduct;

        public HomeController(IProduct iproduct)

        {

            this._iproduct = iproduct;

        }

        public ActionResult Index()

        {

            var list = new List<Product>()

            {

                new Product{ProductName="iphone4s",ProductPrice=3700},

                new Product{ProductName="iphon5",ProductPrice=3400}

            };

            ViewBag.Price = _iproduct.GetAll(list);

            

            return View();

        }

}

利用构造函数从容器中取出来对应的服务,好了,非常感谢群里的的技术指导。非常感谢

你可能感兴趣的:(inject)