将 IOptions<> 注入静态类

Dam*_*ian 2 c# dependency-injection appsettings asp.net-core

我想保持类为静态。是否有任何解决方法可以在IOptions<EncryptionSettings>不修改访问修饰符的情况下注入?

public static class Encrypter
{
    private static readonly Encoding encoding = Encoding.UTF8;

    private static readonly EncryptionSettings _encryptionSettings;

    public static Encrypter(IOptions<EncryptionSettings> encryptionSettings)
    {
        _encryptionSettings = encryptionSettings.Value;
    }

    public static string Encrypt(string plainText)
    {
        (...)
    }

    public static string Decrypt(string plainText)
    {
        (...)
    }

    static byte[] HmacSHA256(String data)
    {
        (...)
    }
}
Run Code Online (Sandbox Code Playgroud)

'Encrypter.Encrypter(IOptions)':静态构造函数上不允许使用访问修饰符

'Encrypter.Encrypter(IOptions)':静态构造函数必须是无参数的

Nko*_*osi 6

糟糕的设计选择使该类成为静态。

您正在经历与尝试将其与依赖注入一起使用的挑战。静态和 DI 不能很好地混合,应尽可能避免。

将所需的功能封装在抽象之后。

public interface IEncrypter {
    string Encrypt(string plainText);
    string Decrypt(string plainText);
}
Run Code Online (Sandbox Code Playgroud)

并实施它

public class Encrypter : IEncrypter {
    private static readonly Encoding encoding = Encoding.UTF8;
    private readonly EncryptionSettings _encryptionSettings;

    public Encrypter(IOptions<EncryptionSettings> encryptionSettings) {
        _encryptionSettings = encryptionSettings.Value;
    }

    public string Encrypt(string plainText) {
        //(...)
    }

    public string Decrypt(string plainText) {
        //(...)
    }

    static byte[] HmacSHA256(String data) {
        //(...)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这将允许IEncrypter根据需要注入加密抽象及其自身的依赖项。即IOptions<TOption>

如果打算成为唯一的加密服务,则在启动时将其注册为单例

services.AddSingleton<IEncrypter, Encrypter>();
Run Code Online (Sandbox Code Playgroud)