是否可以在回圈中添加所有IHostedService實作的類而不在 ASP.NET Core 6 中單獨添加它們?
假設我們有這兩個實作:
public class FirstImplementationOfHostedService : IHostedService
{
// ...
}
public class SecondImplementationOfHostedService : IHostedService
{
// ...
}
Program.cs添加它們的默認方法是:
builder.Services.AddHostedService<FirstImplementationOfHostedService>();
builder.Services.AddHostedService<SecondImplementationOfHostedService>();
但是,如果有一百個實作呢?
必須有一種更好的方法來添加(在運行時)一百個實作,Program.cs而無需明確拼出它們的所有名稱!
uj5u.com熱心網友回復:
您可以使用這樣的 nuget 包,也可以創建擴展方法并通過反射獲取所有服務參考:
public static class ServiceCollectionExtensions
{
public static void RegisterAllTypes<T>(this IServiceCollection services,
Assembly[] assemblies,
ServiceLifetime lifetime = ServiceLifetime.Transient)
{
var typesFromAssemblies = assemblies.SelectMany(a =>
a.DefinedTypes.Where(x => x.GetInterfaces().Contains(typeof(T))));
foreach (var type in typesFromAssemblies)
services.Add(new ServiceDescriptor(typeof(T), type, lifetime));
}
}
然后在 startup.cs 呼叫它
public void ConfigureServices(IServiceCollection services)
{
// ....
services.RegisterAllTypes<IInvoicingService>(new[] { typeof(Startup).Assembly });
}
但要小心,您正在集合中注冊服務。這里有一個長版本的答案。你應該檢查一下。
uj5u.com熱心網友回復:
您可以使用 scrutor 進行程式集掃描(這似乎是您想要的)https://andrewlock.net/using-scrutor-to-automatically-register-your-services-with-the-asp-net-core-di -容器/
uj5u.com熱心網友回復:
@nzrytmn 的答案完全奏效。非常感謝!
我只是做了一些調整RegisterAllTypes來滿足我自己的要求:
public static void RegisterAllTypes<T>(this IServiceCollection services)
{
var assemblies = new[] { Assembly.GetEntryAssembly() };
var typesFromAssemblies = assemblies.SelectMany(a => a?.DefinedTypes.Where(x => x.GetInterfaces().Contains(typeof(T))));
foreach (var type in typesFromAssemblies)
services.Add(new ServiceDescriptor(typeof(T), type, ServiceLifetime.Singleton));
}
然后在Program.cs:
builder.Services.RegisterAllTypes<IHostedService>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446537.html
上一篇:LINQ選擇重復的物件值
