C# StructureMap没有';在HttpModule构造过程中似乎没有准备好——这是正确的吗?
这个问题更多的是为了证实我对我们遇到的问题的诊断——或者寻找其他解释 我们有一个HTTPModule,它可以拦截向我们的webforms应用程序发出的每个请求。它的工作是翻译我们的集成合作伙伴发送的特定查询字符串参数 更重要的是,它是这样连接到StructureMap的:C# StructureMap没有';在HttpModule构造过程中似乎没有准备好——这是正确的吗?,c#,.net,structuremap,httpmodule,race-condition,C#,.net,Structuremap,Httpmodule,Race Condition,这个问题更多的是为了证实我对我们遇到的问题的诊断——或者寻找其他解释 我们有一个HTTPModule,它可以拦截向我们的webforms应用程序发出的每个请求。它的工作是翻译我们的集成合作伙伴发送的特定查询字符串参数 更重要的是,它是这样连接到StructureMap的: public class SomeModule : IHttpModule { public SomeModule() { ObjectFactory.BuildUp(this); }
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; }
}
所以,我的朋友,我有一些关于这种行为的问题:
- 我怀疑StructureMap在调用HttpModule构造函数时没有完全初始化/配置——同意/不同意,有什么见解吗
- 我还没有找到任何说明何时应该初始化StructureMap并准备好为请求提供服务的参考资料。是否有此类文件
由开发人员决定何时初始化StructureMap。在web应用程序中,这几乎总是在应用程序_Start()中的Global.asax中完成。在这种情况下,我希望在调用模块时容器已经准备就绪。对于构造函数中StructureMap调用的可预测性,您是否可以引用任何参考资料?在挖掘具体答案的过程中,我遇到了巴勒莫(SM作者之一)使用
building(这个)的参考文献代码>在构造器中,我不能在任何他们说这是个坏主意的地方选址。但我要举的例子是继承。如果在构造函数中调用build(),并且它正确地填充了依赖项,那么这似乎很好,但是如果继承树中还有更多的构造函数需要调用,那么该值可能会被覆盖。
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;
}
}