zoukankan      html  css  js  c++  java
  • IoC容器Autofac正篇之依赖注入(六)

    依赖注入,这个专业词我们可以分为两个部分来理解:

       依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A;

       注入,医生通过针头将药物注入到病人体内。注入也就是由外向内注入、灌输一些东西。

       综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化。

    三种注入方式

     一.构造器注入  

         类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入

    class Program
    {
        static void Main(string[] args)
        {
            var b = new B();
            var a = new A(b);
        }
    }
    
    class A
    {
        private B _b;
        public A(B b)
        {
            this._b = b;
        }
    }
    
    class B { }

     构造器注入是默认行为,不需要设置,autofac自动完成了构造注入的工作。

    二.属性注入

        修改上面的A类,将变量_b通过属性暴露出来且删掉有参构造方法,然后看看我们平常写代码时怎么实现属性注入的:

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();   
            var b = new B();
            a.B = b;    //通过属性来注入具有依赖关系的B
        }
    }
    

    来看看autofac是怎么进行属性注入的:

          属性注入的所有注入方式都是在注册时定义的。

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            // 通过PropertiesAutowired制定类型A在获取时会自动注入A的属性
            builder.RegisterType<A>().PropertiesAutowired();
            builder.RegisterType<B>();
    
            var container = builder.Build();
            var a = container.Resolve<A>();
    
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }
    

      使用PropertiesAutowired也只是能指定某个类会自动进行属性注入。PropertiesAutowired方式会自动注入所有可以注入的属性,但是如果只想注入指定几个属性,可以使用除PropertiesAutowired以外的几种注入方式,WithProperty就是其中一种:

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<A>().WithProperty(new NamedPropertyParameter("B", new B()));
            // builder.RegisterType<A>().WithProperty("B", new B());    //效果与上面相同
    var container = builder.Build(); var a = container.Resolve<A>(); Console.Write("Press any key to continue..."); Console.ReadKey(); } }

      在注册篇里面有讲到一种lambda注册方式,lambda注册时,因为是写lambda表达式进行注册,其lambda内容可以写很多,其中就可以进行属性注入:

    var builder = new ContainerBuilder();
    builder.Register(c =>
    {
        var _a = new A();
        _a.B = new B(); //手动注入
        return _a;
    });
    

    三 方法注入

    方法注入有两种方式,也就是属性注入的后两种方式:lambda以及事件

    var builder = new ContainerBuilder();
    
    // lambda
    builder.Register(cc =>
    {
        var _a = new A();
        _a.MethodInjection(new B());
        return _a;
    });
    
    // 事件
    builder.RegisterType<A>().OnActivated(e =>
    {
        e.Instance.MethodInjection(new B());
    });
    

      MethodInjection为A的一个方法且它需要一个类型为B的参数,我们在外部通过方法的方式将B传入,这就是方法注入

    尾述

         个人还是推荐使用默认最简单的构造注入,属性注入推荐设置自动属性注入;方法注入还是不怎么推荐的。其实这里的推荐原则是这样的,需要在注册时进行指定注入的方式实际是不太好的,因为后来的人可能不太清楚每个类型的注入规则,还需要到注册的地方进行查看,而且不同人员写的不同,这样容易混乱。而在获取时进行注入,实际也是不太妥的,因为在实际的用法中,我们会将注册类型与接口进行关联,在获取是直接获取接口类型。也正因为我们获取时获取的是接口类型,我们无法保证接口的实际实现是不是具有我们预期的参数。

  • 相关阅读:
    iis重写模块实现程序自动二级域名,微软提供的URL重写2.0版本适用IIS以上
    借助微软提供的url重写类库URLRewriter.dll(1.0)实现程序自动二级域名,域名需要泛解析
    AspNetPager控件报错误: Syntax error, unrecognized expression: input#ctl00$ContentPlaceHolder1$Aspnetpager1_input问题解决[摘]
    精准定位才能赢得人心
    IIS7.5打开GZip压缩,同时启用GZip压缩JS/CSS文件的设置方法[bubuko.com]
    c#变量缺少using引用,如何快速加上using,加Using的快捷键[bubuko.com]
    chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
    要用于尝试,广东移动间接实现“流量不清零”[bubuko.com]
    jquery中ajax在firefox浏览器下“object XMLDocument”返回结果的解决办法
    mvc中Url.RouteUrl或者Html.RouteLink实现灵活超链接,使href的值随路由名称或配置的改变而改变[bubuko.com]
  • 原文地址:https://www.cnblogs.com/tiantianle/p/5191439.html
Copyright © 2011-2022 走看看