在 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库的方式有多种,所以不想多次添加过滤器。

如何“尝试添加”使用工厂的启动过滤器?

你可以添加

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 添加了其他启动过滤器。

脏但适用于简单的情况。