【问题标题】:Dependency Injection to resolve dependency with runtime data依赖注入来解决与运行时数据的依赖关系
【发布时间】:2017-08-23 22:30:49
【问题描述】:

我正在为我的 web api 项目使用简单的注入器。我有一个需要会话令牌才能实例化的服务。

public class CustomerService
{
   public CustomerService(Auth auth, IRepositoryFactory repositoryFactory)
   {
        // make post call to another web api for validation
        SomeWebApiCallToValidateAuth.vaildate(auth);
   }
}

因此,对于此服务,它需要一个身份验证令牌和一个 repositoryFactory。我希望它能够注入 auth 参数(来自 http Web 请求),同时使用已注册到容器的指定实现来解析存储库工厂。

但我不确定如何使用简单的注入器注册它,或者是否有解决方法。任何帮助都会很棒。谢谢。

【问题讨论】:

  • 为什么不为这项服务也设立一个工厂呢?在其中注入存储库工厂,并使用运行时数据调用方法。另一种选择是检查您的关注点分离。问题中没有足够的信息,所以我无法为您指出那个方向。
  • 您应该在服务中有一个方法,该方法将令牌作为参数进行验证。使用当前方法,如果验证失败,对象初始化将失败,这将破坏整个控制流。如果您仍想继续使用这种方法,那将非常棘手,因为您需要将令牌放在某个地方,以便 DI 容器读取该令牌以初始化服务。不确定哪个 DI 容器有这种支持

标签: c# asp.net-web-api dependency-injection simple-injector


【解决方案1】:

您当前的方法有几个缺点:

关于工厂:注入IRepository 而不是IRepositoryFactory。这可能需要您将真实存储库隐藏在代理后面,如 here 所述。

关于Auth的值,看需要,但如果Auth的值是CustomerServiceAPI的重要组成部分,这证明在@的方法上添加Auth作为参数是合理的987654334@。如果它是一个实现细节,请注入某种IAuthProvider 抽象,允许您在运行时(在构建对象图之后)检索值。同样,这一切都在this article 中进行了描述。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2017-10-25
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多