如何在构建过程中抽象出需要运行时数据的实现?

How to abstract away an implementation that requires runtime data during its construction?

我在依赖注入方面遇到了一些问题。假设我们有以下代码:

[片段 1]

public class FooBar 
{ 
  public FooBar (){}

  public void DoSomething(string param1, int param2)
  {
    var reader = new Reader(param1, param2)
    parser.Read();
  }  
}

我不想再让 class FooBar 使用 new 运算符。我将有两种解析器 ExcelParserXmlParser。他们都实现了一个接口IParser。然后根据配置我将添加一个或另一个解析器,即在 Program.cs 中我将有类似

的东西
if (Environment == something) {
  services.AddSingleton<IParser,ExcelParser>();
} else {
  serrvices.AddSingleton<IParser,XmlParser();
}

代码将是这样的

我的问题是:在片段 1 中,为了实例化我们传递的 Paser param1param2。在片段 2 中,DI 容器将如何获取这些参数来创建实例?我对 DI 的理解缺失了一些东西。

IParser界面更改为:

public interface IParser
{
    void Execute(string param1, string param2);
}

这样,FooBar可以传递参数而不必实例化解析器:

public class FooBar 
{ 
  private readonly IParser _parser;
  
  public FooBar(IParser parser)
  {
      _parser = parser;
  }

  public void DoSomething(string param1, int param2)
  {
      _parser.Execute(param1, param2);
  } 
}

有关原因和方法的更多详细信息,请参阅本文:Dependency Injection Code Smell: Injecting runtime data into components