【问题标题】:Simple Injector:Getting an instance in an extension method简单注入器:在扩展方法中获取实例
【发布时间】:2013-11-20 07:50:48
【问题描述】:

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

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());
}

但是,我并不真正想要对容器的依赖,但我不知道如何获取实例。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 为什么不直接将实例作为参数传递?
  • 你是对的。有时明显的东西太明显了,看不到。
  • 您的代码中存在安全漏洞。 salt 似乎是一些静态常量,这是一个安全问题。 1. 密码应该是散列的,而不是加密的。 2. 每个哈希都应该有自己的盐;对每个密码使用相同的盐可以让攻击者查看哪些用户具有相同的密码。有关该主题的更多信息,请read this
  • @Steven - 你是对的。但是,这不用于使用散列函数加密用户密码,而是通过 X509 证书加密配置文件中的值。

标签: c# .net dependency-injection ioc-container simple-injector


【解决方案1】:

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

因此,您目前正在回退到Service Locator pattern,即far from ideal,应尽可能避免使用。

因此,您要么必须将您的类提升为非静态类,并将您的扩展方法提升为非静态方法,以使其像往常一样被注入,否则您必须将加密器传递给方法。

【讨论】:

  • 我认为在这种情况下添加参数是最简单的。谢谢
  • 为什么不直接将IPasswordHasher 抽象注入包含string CreateHash(string pwd)bool Compare(string password, string hash) 方法的消费者?您可以在IPasswordHasher 实现中注入ICryptFactory,而不是将其注入消费者。
  • 用例实际上是通过自定义 ConfigurationSection 在配置文件中。有没有推荐的通过依赖注入创建这些的方法?也许这是一个完整的“另一个问题”
  • 这可能是一个新问题,但总的来说,我试图阻止应用程序从配置文件中读取,除了组合根;连接依赖项的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2018-08-08
  • 2012-10-27
  • 2016-02-13
相关资源
最近更新 更多