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

标签 c# autofac

我有一个将接口(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/

相关文章:

c# - 加密 azure 网站的数据库连接字符串

c# - Microsoft.Extensions.DependencyInjection : DI'd code runs fine on dotnet CLI/Rider default . NET 配置文件,但导致 VS2022 崩溃

c# - 多返回语句奇怪?

c# - 将 Autofac 和 Moqs 与委托(delegate)工厂一起使用

c# - Autofac 注册程序集类型

c# - Autofac:解析同名注册的 IEnumerable

c# - Autofac单例处理

c# - 按年龄对用户进行分组

c# - 使用反射 C# 获取 JsonProperty 属性的名称

autofac - 如何在Autofac中实现引用计数共享实例?