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 RegisterAssemblyTypes
与 Where
:
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<>));
假设我有通用接口:
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
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 RegisterAssemblyTypes
与 Where
:
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<>));