Autofac – 动态解析带参数的组件

我有一个类接口作为构造函数参数。 这个接口有两个实现,我想根据变量决定在运行时使用什么实现。

问题是上面的类深入到了由Autofac解析的对象层次结构中,所以我无法传入参数。

像下面这样的Somehing就是我想要实现的目标。

public interface IInterface1 {} public interface IInterface2 {} public class Class1 : IInterface2 { public Class1(IInterface1 interface1) { } } public class Class2 { public Class2(IInterface2 interface2) { } } public class Class3 { public void GetClass2Instance(string interface1ImplementationToChoose) { // want to change which implementation of IInterface1 is resolved based on the interface1ImplementationToChoose variable var class2 = container.Resolve(); } } 

有任何想法吗?

更新:

为了澄清,这是一个现有的对象层次结构,现有的应用程序使用它可以正常工作。 此外,对象模型比此示例中显示的对象模型大得多。 因此,我真的不想将工厂传递给对象图中的每个构造函数,以供该图中深层的类使用。

有没有办法让IInterface1的不同实现传递到Class1而没有Class2知道它的任何内容?

谢谢

是的,注入一个隐藏如何选择类型的工厂:

 public class Class3 { private Func _class2Factory; public Class3(Func class2Factory) { _class2Factory = class2Factory; } public void GetClass2Instance(string interface1ImplementationToChoose) { var class2 = _class2Factory(interface1ImplementationToChoose); } } 

然后是容器设置,这些内容如下:

 builder.RegisterType().Named("imp1").As(); builder.RegisterType().Named("imp2").As(); builder.Register>(c => { var context = c.Resolve(); return imp => new Class2(context.Resolve(imp)); }); builder.RegisterType(); 

您现在可以像这样使用Class3

 public class Class4 { public Class4(Class3 class3) { var class2with1 = class3.GetClass2Instance("imp1"); var class2with2 = class3.GetClass2Instance("imp2"); } } 

注意:我假设您的意思是Class2应该注入相同接口IInterface1不同实现。 您的示例有点令人困惑,因为您显示了两个实现不同接口的类。