简单注入器——注入 IHttpHandler

simple injector - inject into IHttpHandler

我正在尝试将 SimpleInjector 嵌入到我的 WCF 项目中(我已按照说明进行操作 here)。到目前为止,除了 IHttpHandler 问题外,一切都进行得很顺利: 当前实现使用 IHttpHandler,后者又使用 MyServiceWrapper 静态实例:

public class IsAliveHandler : IHttpHandler
{
    private const string SERVER_ERROR = "Bad";
    private const string SERVER_OK = "OK";

    public void ProcessRequest(HttpContext context)
    {
        var quoteSucceeded = false;
        var isLastLoginSucceeded = MyServiceWrapperContainer.Manager.IsLastLoginSucceeded;
//More logic here ...
    }
}

现在,由于我将我的应用程序移动到使用 SimpleInjector DI 机制,所以我不能使用这种静态访问,因为我想使用与 DI 容器所持有的实例相同的实例。 此处的构造函数注入出现异常:

[MissingMethodException: Constructor on type '***.Applications.MyServiceWrapperService.KeepAliveHandler.IsAliveHandler' not found.]

有没有办法在这种情况下使用容器?还有其他选择吗?

一般情况下,我能理解这种问题是using state的味道,但目前这是需求。

您的 IsAliveHandler 不能有任何构造函数参数(这是您的应用程序框架的限制)。

相反,您应该将 IsAliveHandler 设为 Humble Object and consider it to be part of your Composition Root

这意味着您从 IsAliveHandler 中提取所有有趣的逻辑(例如,将其提取到 IsAliveService 中)并将 IsAliveHandler 更改为如下内容:

public class IsAliveHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        Bootstrapper.Container.GetInstance<IsAliveService>().Process(context);
    }
}

换句话说,您让 IsAliveHandler 做的唯一一件事就是从 DI 容器请求服务并在已解析的服务上调用适当的方法。

请注意 IsAliveHandler 应保持完全无状态:解析 IsAliveService 不应存储在任何地方。您应该让 DI 容器为您提供正确的实例。

如果此操作在简单注入器 Scope 的上下文之外运行,您可以将操作包装在这样的 Scope:

public void ProcessRequest(HttpContext context)
{
    using (AsyncScopedLifestyle.BeginScope(Bootstrapper.Container))
    {
        Bootstrapper.Container.GetInstance<IsAliveService>().Process(context);
    }
}