Autofac 自动装配
自动装配:从容器中的可用服务中选择一个构造函数来创建对象实例
1 使用组件的默认构造函数创建对象实例
组件代码如下:
public class ConstructorClass { public string Msg = string.Empty; public ConstructorClass() { this.Msg = "默认构造方法"; } public ConstructorClass(Class1 class1) { this.Msg = "Class1"; } public ConstructorClass(Class1 class1,Class2 class2) { this.Msg = "Class1 Class2"; } public ConstructorClass(string para1,string para2) { this.Msg = "para1 para2"; } } public class Class1 { } public class Class2 { }
使用服务的代码如下:
static void Main(string[] args) { var builder = new ContainerBuilder(); builder.RegisterType<ConstructorClass>(); Container=builder.Build(); ResolveTest(); Console.ReadLine(); } public static void ResolveTest() { using(var scope = Container.BeginLifetimeScope()) { var defaultConstructorClass = scope.Resolve<ConstructorClass>(); Console.WriteLine(defaultConstructorClass.Msg); } }
运行结果:
分析:由于容器中的可用服务只有 ConstructorClass ,所以autofac默认是以 ConstructorClass 的默认构造函数来构造组件的实例。
2 在解析时指定使用某个构造函数
组件代码:
public class ConstructorClass { public string Msg = string.Empty; public ConstructorClass() { this.Msg = "默认构造方法"; } public ConstructorClass(Class1 class1) { this.Msg = "Class1"; } public ConstructorClass(Class1 class1,Class2 class2) { this.Msg = "Class1 Class2"; } public ConstructorClass(string para1,string para2) { this.Msg = "para1 para2__"+ para1+ para2; } public ConstructorClass(Class1 class1, string para1,string para2) { this.Msg = "Class1 para1 para2__"+ para1+ para2; } } public class Class1 { } public class Class2 { }
使用服务的代码如下:
static void Main(string[] args) { var builder = new ContainerBuilder(); builder.RegisterType<ConstructorClass>(); Container=builder.Build(); ResolveTest(); Console.ReadLine(); } public static void ResolveTest() { using(var scope = Container.BeginLifetimeScope()) { // 使用默认的构造函数 var defaultConstructorClass = scope.Resolve<ConstructorClass>(); // 使用指定的构造函数 public ConstructorClass(string para1,string para2){} var p1p2Cons = scope.Resolve<ConstructorClass>(new NamedParameter("para1", "p1"), new NamedParameter("para2", "p2")); // 注意参数名一定要与构造方法里的参数名一致 // 使用指定的构造函数 public ConstructorClass(Class1 class1, string para1,string para2) var c1p1p2Cons=scope.Resolve<ConstructorClass>(new TypedParameter(typeof(Class1), new Class1()), new NamedParameter("para1", "p1"), new NamedParameter("para2", "p2")); Console.WriteLine(defaultConstructorClass.Msg); Console.WriteLine(p1p2Cons.Msg); Console.WriteLine(c1p1p2Cons.Msg); } }
运行结果:
3 尽可能最多参数匹配
组件代码:
public class ConstructorClass { public string Msg = string.Empty; public ConstructorClass() { this.Msg = "默认构造方法"; } public ConstructorClass(Class1 class1) { this.Msg = "Class1"; } public ConstructorClass(Class1 class1,Class2 class2) { this.Msg = "Class1 Class2"; } public ConstructorClass(string para1,string para2) { this.Msg = "para1 para2__"+ para1+ para2; } public ConstructorClass(Class1 class1, string para1,string para2) { this.Msg = "Class1 para1 para2__"+ para1+ para2; } } public class Class1 { } public class Class2 { }
使用服务的代码如下:
static void Main(string[] args) { var builder = new ContainerBuilder(); builder.RegisterType<Class1>(); builder.RegisterType<Class2>(); //builder.RegisterType<ConstructorClass>().UsingConstructor(typeof(Class1),typeof(Class2)); // 需要注册 Class1和Class2 builder.RegisterType<ConstructorClass>(); Container =builder.Build(); ResolveTest(); Console.ReadLine(); } public static void ResolveTest() { using(var scope = Container.BeginLifetimeScope()) { var cons = scope.Resolve<ConstructorClass>(); Console.WriteLine(cons.Msg); } }
运行结果:
由于 Class1和Class2都已注册,所以ConstructorClass构造实例时会优先匹配有 Class1和Class2和构造方法。
参考
https://www.cnblogs.com/GnailGnepGnaw/p/10757340.html