C# Autofac-动态解析带有参数的组件
我有一个类,它将接口作为构造函数参数。这个接口有两个实现,我想根据一个变量决定在运行时使用什么实现 问题是,上面的类深入到了一个由Autofac解决的对象继承权中,因此我无法传入参数 下面是我想要实现的目标C# Autofac-动态解析带有参数的组件,c#,autofac,C#,Autofac,我有一个类,它将接口作为构造函数参数。这个接口有两个实现,我想根据一个变量决定在运行时使用什么实现 问题是,上面的类深入到了一个由Autofac解决的对象继承权中,因此我无法传入参数 下面是我想要实现的目标 public interface IInterface1 {} public interface IInterface2 {} public class Class1 : IInterface2 { public Class1(IInterface1 interface1)
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<Class2>();
}
}
公共接口IIinterface1{}
公共接口IIinterface2{}
公共类1:IInterface2
{
公共1级(I接口1接口1)
{
}
}
公共课2
{
公共类2(接口2)
{
}
}
公共班级3
{
public void getclass2实例(字符串接口1实现选择)
{
//要更改基于interface1ImplementationToChoose变量解析的IIInterface1实现吗
var class2=container.Resolve();
}
}
有什么想法吗
更新:
澄清一下,这是一个现有的对象层次结构,由工作正常的现有应用程序使用。此外,对象模型比本例中显示的模型大得多。因此,我真的不想将工厂传递给对象图中的每个构造函数,以供该图中深层的类使用
有没有一种方法可以让IInterface1的不同实现在Class1中传递,而Class2对此一无所知
谢谢是的,注入一个工厂,隐藏类型的选择方式:
public class Class3
{
private Func<string, Class2> _class2Factory;
public Class3(Func<string, Class2> class2Factory)
{
_class2Factory = class2Factory;
}
public void GetClass2Instance(string interface1ImplementationToChoose)
{
var class2 = _class2Factory(interface1ImplementationToChoose);
}
}
注意:我假设您的意思是
Class2
应该注入相同接口的不同实现IInterface1
。您的示例有点混乱,因为您展示了两个实现不同接口的类 您说“这个接口有两个实现…”,但您的示例并没有很好地说明这一点。请你详细说明一下,然后我会相应地更新我的答案;另外,c=>new Class2(context.Resolve(imp))就足够了(除非您要保留一个引用,否则不需要显式解析IComponentContext。)我不仅要更新Class2
,在这种情况下,我要注册一个Func
委托,它必须携带自己的上下文。是吗?@Nicholas-我忘了我应该为Register调用指定委托类型,也许这现在更有意义了。我仍然觉得我必须解决一个新的上下文来“存储”在lambda中。。。
builder.RegisterType<Implementation1>().Named("imp1").As<IInterface1>();
builder.RegisterType<Implementation2>().Named("imp2").As<IInterface1>();
builder.Register<Func<string, Class2>>(c =>
{
var context = c.Resolve<IComponentContext>();
return imp => new Class2(context.Resolve<IInterface1>(imp));
});
builder.RegisterType<Class3>();
public class Class4
{
public Class4(Class3 class3)
{
var class2with1 = class3.GetClass2Instance("imp1");
var class2with2 = class3.GetClass2Instance("imp2");
}
}