1 回答

TA貢獻1871條經驗 獲得超8個贊
您可以使用工廠重載來AddScoped
實現您希望每個租戶/請求都不同的服務。這是一個例子:
services.AddScoped<IServiceForTenant>(sp =>
{
? ? var httpContextAccessor = sp.GetRequiredService<IHttpContextAccessor>();
? ? var serviceForTenant = new ServiceForTenant();
? ? // TODO: Use httpContextAcccessor.HttpContext to configure serviceForTenant.
? ? return serviceForTenant;
});
對于進入 ASP.NET Core 應用程序的每個請求,上面的代碼將在您首次IServiceForTenant在控制器中發出請求時運行。此時,您的代碼可以讀取IHttpContextAccessor.HttpContext并做出所需的任何決策,以便為IServiceForTenant. 然后,該相同的實例將用于請求的其余部分(即管道的更上游)。
傳入的參數AddScoped是Func<IServiceProvider, T>. 您需要在這里提供某種委托,這可以通過多種方式之一來完成。以下是一些示例:
您可以將調用包裝到其自己的擴展方法中,如下所示:
public static void AddServiceForTenant(this IServiceCollection services)
{
? ? services.AddScoped<IServiceForTenant>(sp =>
? ? {
? ? ? ? // ...
? ? });
}
在ConfigureServices:
services.AddServiceForTenant();
使用帶有方法的類static:
public static class ServiceForTenantFactory
{
? ? public static ITenantForService Create(IServiceProvider sp)
? ? {
? ? ? ? // ...
? ? }
}
在ConfigureServices:
services.AddScoped(ServiceForTenantFactory.Create);
使用帶有實例方法的類:
public class ServiceForTenantFactory
{
? ? public ITenantForService Create(HttpContext httpContext)
? ? {
? ? ? ? // ...
? ? }
}
在ConfigureServices:
services.AddScoped(sp =>
{
? ? var httpContextAccessor = sp.GetRequiredService<IHttpContextAccessor>();
? ? var serviceForTenantFactory = new ServiceForTenantFactory(); // Or use DI.
? ? return serviceForTenantFactory.Create(httpContextAccessor.HttpContext);
});
最后一個選項是最靈活的,因為您甚至可以ServiceForTenantFactory從 DI 解析自身,并且它可以有自己的依賴項等。另請注意,Create這里直接采用HttpContext(作為示例)。
正如我已經說過的,還有比所示的三個更多的選項,但這應該是一個很好的使用基礎。
- 1 回答
- 0 關注
- 123 瀏覽
添加回答
舉報