如何在构建过程中抽象出需要运行时数据的实现?
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
运算符。我将有两种解析器 ExcelParser
和 XmlParser
。他们都实现了一个接口IParser
。然后根据配置我将添加一个或另一个解析器,即在 Program.cs
中我将有类似
的东西
if (Environment == something) {
services.AddSingleton<IParser,ExcelParser>();
} else {
serrvices.AddSingleton<IParser,XmlParser();
}
代码将是这样的
我的问题是:在片段 1 中,为了实例化我们传递的 Paser param1
和 param2
。在片段 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。
我在依赖注入方面遇到了一些问题。假设我们有以下代码:
[片段 1]
public class FooBar
{
public FooBar (){}
public void DoSomething(string param1, int param2)
{
var reader = new Reader(param1, param2)
parser.Read();
}
}
我不想再让 class FooBar
使用 new
运算符。我将有两种解析器 ExcelParser
和 XmlParser
。他们都实现了一个接口IParser
。然后根据配置我将添加一个或另一个解析器,即在 Program.cs
中我将有类似
if (Environment == something) {
services.AddSingleton<IParser,ExcelParser>();
} else {
serrvices.AddSingleton<IParser,XmlParser();
}
代码将是这样的
我的问题是:在片段 1 中,为了实例化我们传递的 Paser param1
和 param2
。在片段 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。