这里主要学习一下Autofac的依赖注入方式
默认构造函数注入
class A{ public B _b; public A() { } public A(B b) { this._b = b; }}class B { }
builder.RegisterType();builder.RegisterType();using (var container = builder.Build()){ //A的构造方法需要参数b,但是这里不需要做更多地操作,如果不注册类型B,这里a._b=null var a = container.Resolve();}
如果类型A和类型B都注册到了autofac中,那么在通过autofac解析获取A时,autofac会检测到A的构造方法中是要一个参数B,而类型B是已经注册到autofac中的,所以autofac会自动创建b参数,然后传入A的构造方法中的。这样,autofac就自动帮我们完成了构造注入的工作
属性注入
属性注入的所有注入方式都是在注册时定义的,不像构造注入那般,可以在Resolve时传参注入。构造器注入是默认行为,不需要设置,默认会去检查,而属性注入并不是默认行为。但是我们可以通过设置,让属性注入也成为自动注入。
通过反射,使用PropertiesAutowired()修饰符注入属性
builder.RegisterType().PropertiesAutowired();builder.RegisterType();using (var container = builder.Build()){ var a = container.Resolve();}
使用PropertiesAutowired也只是能指定某个类会自动进行属性注入,没有一键设置所有类型都会自动注入属性的设置。而且还需要注意一点,设置了自动属性注入后,也不代表所有属性都会自动注入,只有注册到Autofac中的类型才能自动注入。PropertiesAutowired方式会自动注入所有可以注入的属性(在容器中已注册的类型中寻找),但是如果只想注入指定几个属性,可以使用除PropertiesAutowired以外的几种注入方式
如果预先知道属性的名字和值,可以使用:WithProperty,此时类型B是可以不被注册的,因为在WithProperty方法中进行了实例化
builder.RegisterType().WithProperty("_b", new B());using (var container = builder.Build()){ var a = container.Resolve();}
lambda表达式
builder.Register(c => new A { _b = c.Resolve() });builder.RegisterType();using (var container = builder.Build()){ var a = container.Resolve();}
方法注入
使用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();}
SetInject为A的一个方法,并且它需要一个类型为B的参数,我们在外部通过方法的方式将B传入,这就是方法注入
使用Activating Handler 一行代码解决