c# – 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<Class2>();
    }
}

有任何想法吗?

更新:

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

有没有办法让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);
   }
}

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

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应该注入相同接口IInterface1的不同实现.您的示例有点令人困惑,因为您显示了两个实现不同接口的类.

上一篇:c# – Autofac – SingleInstance HttpClient


下一篇:c# – 了解Autofac生命周期范围