zoukankan      html  css  js  c++  java
  • MVC三个IOC注入点之Ninject使用示例

    群里一个技术大牛说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();
            }
    }
    复制代码

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

    from: http://www.cnblogs.com/flyfish2012/p/3282261.html

  • 相关阅读:
    如何快速开发一个自己的项目脚手架?
    Vue模板语法中数据绑定
    vue组件间通信八种方式
    浏览器渲染页面流程
    双飞翼布局
    单行截断和多行截断问题
    flex 布局实现固定头部和底部,中间滚动布局
    defer 和 async 区别
    数学之美(统计语言模型)
    react 源码之setState
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4616436.html
Copyright © 2011-2022 走看看