我有一個服務,我們稱之為 SearchService,它使用多個端點,每個端點都處理一種特定的語言。端點由基于組態檔內容初始化的客戶端類表示。我想將所有客戶端作為依賴項注入主服務,但客戶端的數量只能在運行時確定。這是一個簡化的示例:
public class SearchService : ISearchService
{
public SearchService(IReadOnlyList[] clients) => this.clients = clients;
public string Search(Language language) { // call language-specific client }
}
public class Client : IClient
{
public Client(Language language) => Language = language
public Language Language { get; }
public string Search() { // call language-specific endpoint }
}
在組合根目錄下,我想設定服務的依賴項。我正在使用 DryIoc,到目前為止我所做的是:
container.Register<ISearchService, SearchService>();
foreach (var config in SearchClientConfigurations)
{
var client = new Client(config.Language);
container.RegisterInstance<IClient>(client);
}
這似乎很好,如果我container.Resolve<ISearchService>()
作為測驗呼叫,該服務會按預期接收客戶端串列。然而,這導致客戶端被創建為單例(據我所知),即使服務和客戶端有一個單例的生命周期,它也感覺不對。我希望客戶具有與服務相同的生命周期,例如使用Setup.UseParentReuse
. 將此添加到客戶端注冊中當然不起作用(這完全有道理)。
我已經多次瀏覽檔案并進行了大量搜索;可能我現在太困惑了,無法找到解決方案。
我正在考慮將一個工廠注入到將創建客戶的服務中,然后工廠可以與服務具有相同的生命周期,但我的直覺告訴我這不是最好的方法:處理客戶的生命周期應該由 DI 容器負責。我想我需要指定一個工廠方法(我已經閱讀了 檔案中的相關章節),但我就是想不通。
uj5u.com熱心網友回復:
在 DryIoc 中堅持最簡單直接的注冊,但只是避免RegisterDelegate<T>((IResolverContext r) => ...)
,因為它是一個黑盒服務定位器,而是使用依賴型別的委托:
foreach (var config in SearchClientConfigurations)
{
var lang = config.Language;
container.RegisterDelegate<IClient>(() => new Client(lang),
setup: Setup.With(useParentReuse: true)); // or whatever other reuse or setup
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/483199.html
下一篇:Unity-虛擬搖桿-相機旋轉