zoukankan      html  css  js  c++  java
  • MVC 使用IOC实现

    实现步骤:

    1. 实现IDependencyResolver接口并通过DependencyResolver.SetResolver告知MVC,将部分类型实例解析工作交由IoC容器来处理;

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    
    namespace MvcIocDemo.IoC
    {
        public class UnityDependencyResolver : IDependencyResolver
        {
            IUnityContainer container;
    
            public UnityDependencyResolver(IUnityContainer container)
            {
                this.container = container;
            }
    
            public object GetService(Type serviceType)
            {
                if (!this.container.IsRegistered(serviceType))
                {
                    return null;
                }
                return container.Resolve(serviceType);
            }
    
            public IEnumerable<object> GetServices(Type serviceType)
            {
                return container.ResolveAll(serviceType);
            }
        }
    }

    2. 继承DefaultControllerFactory,重载GetControllerInstance方法,并通过IoC容器将之注册为IControllerFactory的实现。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using Microsoft.Practices.Unity;
    using System.Web.SessionState;
    
    namespace MvcIocDemo.IoC
    {
        public class UnityControllerFactory : DefaultControllerFactory
        {
            IUnityContainer container;
            public UnityControllerFactory(IUnityContainer container)
            {
                this.container = container;
            }
    
            protected override IController GetControllerInstance(RequestContext reqContext,
                Type controllerType)
            {
                return container.Resolve(controllerType) as IController;
            }
    
        }
    
    }

    3  在函数Application_Start() 中添加如下代码:

            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
    
                IUnityContainer container = new UnityContainer();
                container.RegisterType<IServiceA, ServiceA>();
                container.RegisterType<IServiceB, ServiceB>();;
                container.RegisterType<IControllerFactory, UnityControllerFactory>();
                DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            }

    4 在控制器中使用

        public class HomeController : Controller
        {
            protected IServiceA _serviceA;
            protected IServiceB _serviceB;
    
            public HomeController(IServiceA serviceA, IServiceB serviceB)
            {
                _serviceA = serviceA;
                _serviceB = serviceB;
            }
    
            public ActionResult Index()
            {
                ViewBag.A = _serviceA.Say();
                ViewBag.B = _serviceB.Write();
                return View();
            }
    
        }
  • 相关阅读:
    黄聪:.NET中zip的压缩和解压——SharpCompress
    黄聪:在.NET中使用GeckoFX 29
    【转】C# 开发Chrome内核浏览器(WebKit.net)
    Can annotations be created or edited in ArcGIS Pro?
    ArcGIS Pro 新建一个Aprx,导入Mxd
    ArcGIS Pro项目保存和数据编辑保存
    ArcGIS Pro批量线分割面,也可以线分割线
    ArcGIS Pro 删除选择范围的数据和批量裁剪clip
    ArcGIS Pro NearestVertex和NearestPoint
    ArcGIS Pro打印预览
  • 原文地址:https://www.cnblogs.com/mikechang/p/3270572.html
Copyright © 2011-2022 走看看