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>();
}
原文地址:https://www.cnblogs.com/GnailGnepGnaw/p/10753619.html