zoukankan      html  css  js  c++  java
  • 搞定.NET MVC IOC控制反转,依赖注入

    一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记!

    1、首先创建MVC项目

    2、然后新建一个接口IServiceA

    public interface IServiceA
        {
            string Name();
        }
    

    实现接口

    public class ServiceA : IServiceA
        {
            public string Name()
            {
                return "Service A";
            }
        }
    

    简单点说,就是要把IService的调用自动注入ServiceA类型

    新建MVC控制器:HomeController并添加构造函数

        public class HomeController : Controller
        {
            protected Service.IServiceA ServiceA;
            public HomeController(Service.IServiceA a)
            {
                this.ServiceA = a;
            }
        }
    

    下面我们来实现如何通过IOC把IServiceA注入为ServiceA类型

    Nuget添加引用,搜索Unity,如果提示失败的话,就用Nuget的命令添加以前的版本,不知道怎么敲就直接添加PolicyInJection引用好了

    新建类:UnityDependencyReslover

    public class UnityDependencyReslover : System.Web.Mvc.IDependencyResolver
        {
            IUnityContainer container;
            public UnityDependencyReslover(IUnityContainer container)
            {
                this.container = container;
            }

            public object GetService(Type t)
            {
                if (t == null) return null;
                if (!container.IsRegistered(t)) return null;
                return container.Resolve(t);
            }

            public IEnumerable<object> GetServices(Type t)
            {
                return container.ResolveAll(t);
            }
        }

    这个没有啥好说的把,就是实现类型映射的解析而已

    Global.asax的Application_Start中注册解析类型映射

    IUnityContainer container = new UnityContainer();
    container.RegisterType<Service.IServiceA, Service.ServiceA>();
    container.RegisterType<IControllerFactory, IOC.MyControllerFactory>();
    DependencyResolver.SetResolver(new IOC.UnityDependencyReslover(container));

    看标红的那句,这里简单说明一下,HomeController的构造函数带了参数,默认情况下MVC的控制器初始化没有参数的,这里我们要自己去实现对参数的解析,也就是在这个地方注入参数,不然你的MVC控制器无法访问

    新建:MyControllerFactory继承System.Web.Mvc.DefaultControllerFactory
    public class MyControllerFactory : DefaultControllerFactory
    {
      IUnityContainer container;
      public MyControllerFactory(IUnityContainer container)
       {
         this.container = container;
       }
       protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
       {
         if (controllerType == null) return null;
         return container.Resolve(controllerType) as IController;
       }
    }

    这样就行啦!

    在你的MVC的HomeController里面添加一个Action访问下IServiceA的Name方法试试,是不是可以了!

    这里我要说明一下,有几个地方要注意:那个IUnityContainer 要统一,先前我尝试过一直不成功,后来发现是有的地方用的是UnityContainer,所以还是要认真一点!

    添加代码,代码无法高亮加粗,所以没用代码形式添加!

  • 相关阅读:
    【原】AMFObject数据格式详解
    STL总结 (C++)
    git相关项目迁移
    OBS_Classic经典版框架
    windows线程同步的几种方式
    面试题之strcpy / strlen / strcat / strcmp的实现
    python实用技巧
    Python Flask学习笔记之数据库
    Python Flask学习笔记之Web表单
    必应每日壁纸批量下载
  • 原文地址:https://www.cnblogs.com/263613093/p/4344642.html
Copyright © 2011-2022 走看看