Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac-动态解析带有参数的组件_C#_Autofac - Fatal编程技术网

C# Autofac-动态解析带有参数的组件

C# Autofac-动态解析带有参数的组件,c#,autofac,C#,Autofac,我有一个类,它将接口作为构造函数参数。这个接口有两个实现,我想根据一个变量决定在运行时使用什么实现 问题是,上面的类深入到了一个由Autofac解决的对象继承权中,因此我无法传入参数 下面是我想要实现的目标 public interface IInterface1 {} public interface IInterface2 {} public class Class1 : IInterface2 { public Class1(IInterface1 interface1)

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

问题是,上面的类深入到了一个由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>();
    }
}
公共接口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");
     }
}