我有一个将接口(interface)作为构造函数参数的类。这个接口(interface)有两个实现,我想根据一个变量来决定在运行时使用哪个实现。
问题是上面的类在 Autofac 解析的对象层次结构中很深,所以我不能传入参数。
类似下面的内容是我想要实现的目标。
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>();
}
}
有什么想法吗?
更新:
澄清一下,这是一个现有的对象层次结构,由运行良好的现有应用程序使用。此外,对象模型比本例中显示的模型大得多。因此,我真的不想必须将工厂传递给对象图中的每个构造函数,以供该图中深处的类使用。
有没有办法在 Class2 不知道的情况下将 IInterface1 的不同实现传递给 Class1?
谢谢
最佳答案
是的,注入(inject)一个隐藏类型选择方式的工厂:
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);
}
}
然后是容器设置,大致如下:
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>();
您现在可以像这样使用 Class3
:
public class Class4
{
public Class4(Class3 class3)
{
var class2with1 = class3.GetClass2Instance("imp1");
var class2with2 = class3.GetClass2Instance("imp2");
}
}
注意: 我假设您的意思是 Class2
应该注入(inject)同一接口(interface) IInterface1
的不同实现。您的示例有点困惑,因为您展示了两个实现不同接口(interface)的类。
关于c# - Autofac - 动态解析带参数的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409207/