这个问题更多的是确认我对我们遇到的问题的诊断 - 或者找到其他解释。
我们有一个HTTPModule拦截对我们的webforms应用程序发出的每个请求。它的工作是转换我们的集成合作伙伴发送的特定查询字符串参数。
更重要的是,它连接到StructureMap,如下所示:
public class SomeModule : IHttpModule
{
public SomeModule()
{
ObjectFactory.BuildUp(this);
}
public IDependency Dependency { get; set; }
}
在之前的版本中,似乎在执行请求处理时没有注入模块。这导致一些(丑陋的)防守检查被添加如下:
public class SomeModule : IHttpModule
{
public SomeModule()
{
ObjectFactory.BuildUp(this);
if (SomeDependency == null)
{
// HACK: Not sure why this corrects the issue!
Dependency = ObjectFactory.GetInstance<ISomeDependency>();
}
}
public IDependency Dependency { get; set; }
}
你会注意到HACK评论 - 它解决了这个问题,但没有充分的理由。
好吧,这个模块已经在另一个网站上重新使用 - 之前的黑客攻击不再有效。看了一段时间之后,我做了更改,将StructureMap调用移到构造函数之外,而且看起来很有效。
public class SomeModule : IHttpModule
{
public IDependency Dependency { get; set; }
public void IHttpModule.Init(HttpApplication context)
{
Initialize();
// the rest of the code
}
private bool _initialized;
private void Initialize()
{
if (_initialized)
{
return;
}
ObjectFactory.BuildUp(this);
_initialized = true;
}
}
所以,我对这种行为有几个问题:
答案 0 :(得分:0)
当您尝试在其构造函数中构建类型时,我不希望该行为是非常可预测的。许多通常被认为是安全的操作在构造函数中不被认为是安全的(比如在类中使用虚拟属性)。
您将代码移动到更好的位置,我会将其留在那里。如果您不能让容器创建实例本身(因此被迫构建它),那么某种Initialize方法是进行构建操作的首选位置。
要回答帖子末尾的问题: 由开发人员决定何时初始化StructureMap。在Web应用程序中,这几乎总是在Application_Start()中的Global.asax中完成。在这种情况下,我希望在调用模块时容器就绪。