我有一个服务,我们称之为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>()
作为测试,服务将按预期接收客户端列表.
我已经阅读了几次文档,并进行了大量搜索;也许我现在太困惑了,找不到解决办法.
我想在服务中注入一个工厂来创建客户,然后工厂可以拥有与服务相同的生命周期,但我的直觉告诉我,这不是最好的方法:处理客户的生命周期应该是DI容器的责任.