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

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

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

IControllerFactory=>IDependencyResolver=>IControllerActivator 

这三者的关系如下:

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

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();
        }
}

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

posted on 2013-08-26 11:53  ~紫鱼~  阅读(1880)  评论(1编辑  收藏  举报