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)':静态构造函数必须是无参数的
糟糕的设计选择使该类成为静态。
您正在经历与尝试将其与依赖注入一起使用的挑战。静态和 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)