我正在尝试将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.]
在这种情况下是否可以使用容器?有其他选择吗?
通常,我可以理解,这种问题是使用状态的味道,但这是目前的要求。
答案 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);
}