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();
            }
    
        }
  • 相关阅读:
    注册和登录与数据库内的链接
    数据访问
    马厩分配问题
    Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum
    最优比例生成树模板
    01分数规划模板
    hiho一下第109周《Tower Defense Game》
    begin.BZOJ 1383: 三取方格数
    最小生成树
    Codeforces Round #364 (Div. 1)B. Connecting Universities
  • 原文地址:https://www.cnblogs.com/mikechang/p/3270572.html
Copyright © 2011-2022 走看看