Autofac RegisterAssemblyTypes 和 RegisterType 在指定 SingleInstance 时实例化相同的实现两次

Autofac RegisterAssemblyTypes and RegisterType instanciates same implementation twice when SingleInstance Specified

假设我有通用接口:

interface ITestGeneric<T>
{
    void Test(T t);
}

和 2 个实现:

class TestImpl1 : ITestGeneric<string>
{
    private readonly string key;

    public TestImpl1(string key=null)
    {
        this.key = key;
    }
    public void Test(string t)
    {
        Console.WriteLine(key);
    }
}
 class TestImp2 : ITestGeneric<string>
{
    public void Test(string t)
    {
        Console.WriteLine(2);

    }
}

并按如下方式注册服务:

var builder = new ContainerBuilder();
        builder.RegisterAssemblyTypes(typeof(Program).GetTypeInfo().Assembly).AsClosedTypesOf(typeof(ITestGeneric<>));
        builder.RegisterType<TestImpl1>().AsImplementedInterfaces().SingleInstance().WithParameter(new TypedParameter(typeof(string),"value1"));
        

在这里,我为实现 TestImpl1 提供了显式参数并使其成为单例。 问题是,当我使用 IEnumerable 解析服务时,我在没有提供任何参数的情况下多次激活了 TestImpl1,尽管预期的行为应该是按照明确提供的方式注册它。

 var c= builder.Build();
 var kk = c.Resolve<ITestGeneric<string>>();
 var r = c.Resolve<IEnumerable<ITestGeneric<string>>>();
 r = c.Resolve<IEnumerable<ITestGeneric<string>>>();
 r = c.Resolve<IEnumerable<ITestGeneric<string>>>();
//creates multiple instances on TestImpl1

如何为单一实现 TestImpl1 提供自定义行为(如单例和显式参数),同时注册所有程序集泛型类型?

P.S。制作 RegisterAssemblyTypes 单例,给我留下 2 个 TestImpl1 实例,其中一个在构造函数中没有提供参数。

您可以 filter RegisterAssemblyTypesWhere:

builder.RegisterAssemblyTypes(typeof(AutofacTests).GetTypeInfo().Assembly)
    .Where(type => type != typeof(TestImpl1))
    .AsClosedTypesOf(typeof(ITestGeneric<>));

Except:

builder.RegisterAssemblyTypes(typeof(AutofacTests).GetTypeInfo().Assembly)
    .Except<TestImpl1>()
    .AsClosedTypesOf(typeof(ITestGeneric<>));