我有一个服务,我们称之为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容器的责任.

推荐答案

在DryIoc中,请坚持最简单的直接注册,但不要使用RegisterDelegate<T>((IResolverContext r) => ...),因为它是一个黑盒服务定位器,请使用dependency typed delegates:

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
}

Csharp相关问答推荐

旋转时,在另一个对象内按比例zoom 对象

使用源生成器,如何使用所有转换后的 node 的聚合生成源?

SortedSet.IsSubsetOf未按预期工作

在Microsoft XNA框架(MonoGame)中旋转相机

. NET Core DB vs JSON模型设计

碰撞检测与盒碰撞器,其isTrigger on问题

如何使用C#Interop EXCEL创建度量衡

Mongo作为.NET中Testcontainers的副本集

如何将不同类型的扩展参数的javascript函数转换成C#风格?

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

WinForms在Linux上的JetBrains Rider中的应用

Automapper 12.x将GUID映射到字符串

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

MSTest--将消息直接写入StdOut和使用TestContext有什么不同?

C#中使用ReadOnlySpan的泛型类型推理

DropDownListFor未显示选定值

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

使DefaultIfEmpty返回空