简单的注入器-注入IHttpHandler

时间:2018-11-12 12:13:44

标签: c# wcf dependency-injection simple-injector ihttphandler

我正在尝试将SimpleInjector嵌入我的WCF项目中(我已遵循here的说明)。到目前为止,除IHttpHandler问题外,其他一切进展顺利: 当前的实现使用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.]

在这种情况下是否可以使用容器?有其他选择吗?

通常,我可以理解,这种问题是使用状态的味道,但这是目前的要求。

1 个答案:

答案 0 :(得分:3)

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

相反,您应该将IsAliveHandler设为Humble Object,并将其视为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);
}