在静态类中使用依赖注入

问题描述 投票:15回答:1

我需要在静态类中使用依赖注入。

静态类中的方法需要注入的依赖项的值。

以下代码示例演示了我的问题:

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;
    }
}
c# class dependency-injection static
1个回答
19
投票

您基本上有两个选择:

  1. 将类从static更改为实例类,并通过IConfiguracion提供Constructor Injection
  2. 通过IConfiguracionExecute提供给Method Injection方法。

这里是每个选项的示例。

选项1.将类从静态更改为实例类

将类从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
    }
}

2。通过方法注入将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,这是一种代码气味。

© www.soinside.com 2019 - 2024. All rights reserved.