在 ASP.NET Core 中使用等效的 TryAddSingleton 注册 IStartupFilter
Register IStartupFilter with TryAddSingleton equivalent in ASP.NET Core
我的 class 库向 ASP.NET 核心容器注册了一个 IStartupFilter
(使用工厂):
services.AddSingleton<IStartupFilter>(serviceProvider =>
ActivatorUtilities.CreateInstance<MyStartupFilter>(serviceProvider, new object[] { arg1, arg2 }));
有效。
但是注册class库的方式有多种,所以不想多次添加过滤器。
- 如果我使用
AddSingleton
则添加服务,但可以添加多次。
- 如果我使用
TryAddSingleton
则根本不会添加该服务 - 因为运行时已经注册了它自己的 IStartupFilter
(HostFilteringStartupFilter
)
如何“尝试添加”使用工厂的启动过滤器?
你可以添加
services.RemoveAll<IStartupFilter>();
在你的代码之前
此外,您可以尝试 ServiceCollectionDescriptorExtensions 中的方法 class:
public static IServiceCollection Replace(this IServiceCollection collection, ServiceDescriptor descriptor);
结果:
这是一种肮脏的方法。如果有更好的方法请post您的回答,我会采纳。
var alreadyRegistered = services.Any(sd =>
sd.ServiceType == typeof(IStartupFilter) &&
sd.ImplementationFactory?.Target?.GetType() == this.GetType()
);
if (!alreadyRegistered)
{
services.AddSingleton<IStartupFilter>(serviceProvider =>
ActivatorUtilities.CreateInstance<MyStartupFilter>(serviceProvider, new object[] { arg1, arg2 }));
}
这与服务集合有关,服务集合是容器的一个实现细节,应该单独保留。并且它假设检查和注册发生在同一个 class 中。而且它实际上并没有指定 MyStartupFilter
,因此您甚至不确定它是否在做正确的事情,尤其是如果 class 添加了其他启动过滤器。
脏但适用于简单的情况。
我的 class 库向 ASP.NET 核心容器注册了一个 IStartupFilter
(使用工厂):
services.AddSingleton<IStartupFilter>(serviceProvider =>
ActivatorUtilities.CreateInstance<MyStartupFilter>(serviceProvider, new object[] { arg1, arg2 }));
有效。
但是注册class库的方式有多种,所以不想多次添加过滤器。
- 如果我使用
AddSingleton
则添加服务,但可以添加多次。 - 如果我使用
TryAddSingleton
则根本不会添加该服务 - 因为运行时已经注册了它自己的IStartupFilter
(HostFilteringStartupFilter
)
如何“尝试添加”使用工厂的启动过滤器?
你可以添加
services.RemoveAll<IStartupFilter>();
在你的代码之前
此外,您可以尝试 ServiceCollectionDescriptorExtensions 中的方法 class:
public static IServiceCollection Replace(this IServiceCollection collection, ServiceDescriptor descriptor);
结果:
这是一种肮脏的方法。如果有更好的方法请post您的回答,我会采纳。
var alreadyRegistered = services.Any(sd =>
sd.ServiceType == typeof(IStartupFilter) &&
sd.ImplementationFactory?.Target?.GetType() == this.GetType()
);
if (!alreadyRegistered)
{
services.AddSingleton<IStartupFilter>(serviceProvider =>
ActivatorUtilities.CreateInstance<MyStartupFilter>(serviceProvider, new object[] { arg1, arg2 }));
}
这与服务集合有关,服务集合是容器的一个实现细节,应该单独保留。并且它假设检查和注册发生在同一个 class 中。而且它实际上并没有指定 MyStartupFilter
,因此您甚至不确定它是否在做正确的事情,尤其是如果 class 添加了其他启动过滤器。
脏但适用于简单的情况。