C# 简单注入器:在扩展方法中获取实例

C# 简单注入器:在扩展方法中获取实例,c#,.net,dependency-injection,ioc-container,simple-injector,C#,.net,Dependency Injection,Ioc Container,Simple Injector,我有一个扩展方法,希望能够通过容器获取类的实例 e、 g 公共静态字符串EncryptString(此SecureString输入) { if(input==null)返回null; var encryptor=Injector.Container.GetInstance().GetEncryptor(salt); 返回encryptor.Encrypt(input.ToInsecureString()); } 然而,我并不真的想要容器上的依赖关系,但我不知道如何获得实例 关于如何做到这一点有

我有一个扩展方法,希望能够通过容器获取类的实例 e、 g

公共静态字符串EncryptString(此SecureString输入)
{
if(input==null)返回null;
var encryptor=Injector.Container.GetInstance().GetEncryptor(salt);
返回encryptor.Encrypt(input.ToInsecureString());
}
然而,我并不真的想要容器上的依赖关系,但我不知道如何获得实例


关于如何做到这一点有什么想法吗?

理想情况下,您希望使用构造函数注入来注入类所需的依赖项。然而,扩展方法只是静态类上的静态方法,不能在静态类上进行构造函数注入

由于这一点,您目前正在退回到,这是并且应该尽可能避免


因此,您必须将类升级为非静态类,将扩展方法升级为非静态方法,以允许像往常一样将其注入,或者必须将加密程序传递到方法中。

为什么不将实例作为参数传递呢?您是对的。有时候,显而易见的东西是看不见的。你的代码中有一个安全缺陷。
salt
似乎是某个静态常量,这是一个安全问题。1.密码应该是散列的,而不是加密的。2.每个散列应该有自己的盐;对每个密码使用相同的salt可以让攻击者看到哪些用户拥有相同的密码。关于这个问题的更多信息,请。@Steven-你说得对。但是,这不是用哈希函数加密用户密码,而是通过X509证书加密配置文件中的值。我认为在这种情况下添加参数是最简单的。谢谢你为什么不把一个
IPasswordHasher
absaction注入你的消费者,其中包含
string CreateHash(string pwd)
bool Compare(string password,string hash)
方法?您可以在
IPasswordHasher
实现中注入
ICryptFactory
,而不是将其注入消费者。用例实际上通过自定义配置部分位于配置文件中。是否有推荐的方法通过依赖项注入来创建这些?也许这是一个完全不同的问题,这可能是一个新问题,但一般来说,我试图阻止应用程序从配置文件中读取,除了组合根;连接依赖项的部分。
public static string EncryptString(this SecureString input)
{
    if (input == null) return null;

    var encryptor = Injector.Container.GetInstance<ICryptFactory>().GetEncryptor(salt);

    return encryptor.Encrypt(input.ToInsecureString());
}