亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

中間件向 DI 容器或服務添加新的依賴項

中間件向 DI 容器或服務添加新的依賴項

C#
守候你守候我 2023-08-20 09:47:34
我正在編寫一個中間件(也許我想要一個范圍服務??),我想我的計劃是擁有某種多租戶場景。例如,如果我有 2 個響應此服務的域:www.domain1.comwww.domain2.com我想在請求啟動時捕獲請求,查看正在使用的主機名,然后通過依賴注入將其他一些對象設置為可用于管道中的所有內容??磥碇虚g件應該是實現這一目標的正確方法,但不確定如何執行最后一步。我的選擇似乎是:中間件注冊Singleton服務來訪問數據庫盡早注冊成為第一個捕獲請求的中間件。分析請求對象并構建自定義配置對象將自定義配置作為范圍對象添加到 DI 容器以供其他服務使用服務注冊Singleton服務來訪問數據庫為 IHttpContextAccessor 注冊 Singleton 服務注冊范圍?服務——相當于中間件分析請求對象并構建自定義配置對象將自定義對象注冊為 DI 容器中的新作用域對象我的假設是服務能夠注冊自定義范圍的對象,因為它仍在ConfigureServicesstartup.cs的方法中然而,對于中間件來說,它是通過ConfigureDI 容器已經構建完成的方法來初始化的?
查看完整描述

1 回答

?
ITMISS

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(作為示例)。


正如我已經說過的,還有比所示的三個更多的選項,但這應該是一個很好的使用基礎。


查看完整回答
反對 回復 2023-08-20
  • 1 回答
  • 0 關注
  • 123 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號