我需要在静态类中使用依赖注入。
静态类中的方法需要注入的依赖项的值。
以下代码示例演示了我的问题:
public static class XHelper
{
public static TResponse Execute(string metodo, TRequest request)
{
// How do I retrieve the IConfiguracion dependency here?
IConfiguracion x = ...;
// The dependency gives access to the value I need
string y = x.apiUrl;
return xxx;
}
}
您基本上有两个选择:
static
更改为实例类,并通过IConfiguracion
提供Constructor Injection。IConfiguracion
将Execute
提供给Method Injection方法。这里是每个选项的示例。
将类从static
更改为实例类,并通过IConfiguracion
提供Constructor Injection。在这种情况下,应将XHelper
注入其使用者的构造函数中。示例:
public class XHelper
{
private readonly IConfiguration config;
public XHelper(IConfiguration config)
{
this.config = config ?? throw new ArgumentNullException(nameof(config));
}
public TResponse Execute(string metodo, TRequest request)
{
string y = this.config.apiUrl; //i need it
return xxx; //xxxxx
}
}
IConfiguracion
提供给Execute
方法。示例:
public static class XHelper
{
public static TResponse Execute(
string metodo, TRequest request, IConfiguracion config)
{
if (config is null) throw new ArgumentNullException(nameof(config));
string y = config.apiUrl;
return xxx;
}
}
所有其他选项都摆在桌面上,因为它们会引起代码异味或反模式。例如,您可能倾向于使用Service Locator模式,但这不是一个好主意,因为它是an anti-pattern。另一方面,属性注入会导致Temporal Coupling,这是一种代码气味。