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
不同实现。 您的示例有点令人困惑,因为您显示了两个实现不同接口的类。
- 自定义Autofac的组件分辨率/具有通用协同/反演的问题
- 插件架构中的DI(Autofac):每个插件有一个单独的DI容器吗?
- MVC 4 Autofac和Generic Repository模式
- 从MVC的DependencyResolver过渡到AutofacWebApiDependencyResolver – 哪里是.Current?
- 如何使用Xamarin和Autofac将构造函数依赖项注入ViewModel?
- 将Autofac和Moq与Delegate Factories一起使用
- Autofac运行时参数
- .NET 4,AllowPartiallyTrustedCallers属性和SecurityCritical等安全标记
- 如何在混合Web API和MVC应用程序中使用Autofac解析Web API控制器?