zoukankan      html  css  js  c++  java
  • Autofac之依赖注入

    这里主要学习一下Autofac的依赖注入方式

    默认构造函数注入

    class A
    {
        public B _b;
    
        public A()
        {
    
        }
        public A(B b)
        {
            this._b = b;
        }
    }
    
    class B { }
    builder.RegisterType<A>();
    builder.RegisterType<B>();
    using (var container = builder.Build())
    {
        //A的构造方法需要参数b,但是这里不需要做更多地操作,如果不注册类型B,这里a._b=null
        var a = container.Resolve<A>();
    }

    如果类型A和类型B都注册到了autofac中,那么在通过autofac解析获取A时,autofac会检测到A的构造方法中是要一个参数B,而类型B是已经注册到autofac中的,所以autofac会自动创建b参数,然后传入A的构造方法中的。这样,autofac就自动帮我们完成了构造注入的工作

    属性注入

    属性注入的所有注入方式都是在注册时定义的,不像构造注入那般,可以在Resolve时传参注入。构造器注入是默认行为,不需要设置,默认会去检查,而属性注入并不是默认行为。但是我们可以通过设置,让属性注入也成为自动注入。

    通过反射,使用PropertiesAutowired()修饰符注入属性

    builder.RegisterType<A>().PropertiesAutowired();
    builder.RegisterType<B>();
    
    using (var container = builder.Build())
    { 
        var a = container.Resolve<A>();
    }

    使用PropertiesAutowired也只是能指定某个类会自动进行属性注入,没有一键设置所有类型都会自动注入属性的设置。而且还需要注意一点,设置了自动属性注入后,也不代表所有属性都会自动注入,只有注册到Autofac中的类型才能自动注入。PropertiesAutowired方式会自动注入所有可以注入的属性(在容器中已注册的类型中寻找),但是如果只想注入指定几个属性,可以使用除PropertiesAutowired以外的几种注入方式

    如果预先知道属性的名字和值,可以使用:WithProperty,此时类型B是可以不被注册的,因为在WithProperty方法中进行了实例化

    builder.RegisterType<A>().WithProperty("_b", new B());
    using (var container = builder.Build())
    {
        var a = container.Resolve<A>();
    }

    lambda表达式

    builder.Register(c => new A { _b = c.Resolve<B>() });
    builder.RegisterType<B>();
    using (var container = builder.Build())
    {
        var a = container.Resolve<A>();
    }

     方法注入

    使用Activator:注意,使用这种方法,类里必须要有这个方法

    class A
    {
        public B _b;
        public A()
        {
    
        }
        public A(B b)
        {
            this._b = b;
        }
    
        public void SetInject(B b)
        {
            _b = b;
        }
    }
    builder.Register(c =>
    {
        var _a = new A();
        _a.SetInject(new B());
        return _a;
    });
    using (var container = builder.Build())
    {
        var a = container.Resolve<A>();
    }

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

    使用Activating Handler 一行代码解决

    builder.Register<A>(c => new A()).OnActivating(e => e.Instance.SetInject(new B()));
    using (var container = builder.Build())
    {
        var a = container.Resolve<A>();
    }
  • 相关阅读:
    判断字符串是否包含某一个值方法
    生成一个随机手机号
    python 常用数据类型及操作方法
    selenium 常用的定位方法
    mysql 多表查询
    转载--python全栈开发学习
    Jenkins执行jmeter自动化脚本方法
    阅读方法
    pytorch学习
    英文阅读材料记录
  • 原文地址:https://www.cnblogs.com/GnailGnepGnaw/p/10753619.html
Copyright © 2011-2022 走看看