简单注入器——注入 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);
}
}
我正在尝试将 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);
}
}