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

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4616436.html
Copyright © 2011-2022 走看看