• 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();
            }
    
        }
  • 相关阅读:
    小程序开发为何使用RPX
    C#判断网址是否可以访问
    [golang]go语言的channel学习
    tensorflow中图像增强的方法详解
    kaggle无法下载数据集解决办法
    keras模型中的model.fit()和model.fit_generator()的区别
    Keras.metrics中的accuracy总结
    Python 字符串前面加u,r,b,f的含义
    损失函数:binary_crossentropy、categorical_crossentropy、sparse_categorical_crossentropy
    jupyter代码自动补全
  • 原文地址:https://www.cnblogs.com/mikechang/p/3270572.html
Copyright © 2020-2023  润新知