在HttpModule构造函数中,StructureMap似乎没有准备好 - 这是正确的吗?

时间:2010-12-14 20:24:50

标签: c# .net structuremap httpmodule race-condition

这个问题更多的是确认我对我们遇到的问题的诊断 - 或者找到其他解释。

我们有一个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;
    }
}

所以,我对这种行为有几个问题:

  • 我怀疑在调用HttpModule构造函数时,StructureMap没有完全初始化/配置 - 同意/不同意,有什么洞察力?
  • 我没有找到任何参考资料,说明何时期望初始化StructureMap并准备服务请求。有没有这样的文件?

1 个答案:

答案 0 :(得分:0)

当您尝试在其构造函数中构建类型时,我不希望该行为是非常可预测的。许多通常被认为是安全的操作在构造函数中不被认为是安全的(比如在类中使用虚拟属性)。

您将代码移动到更好的位置,我会将其留在那里。如果您不能让容器创建实例本身(因此被迫构建它),那么某种Initialize方法是进行构建操作的首选位置。

要回答帖子末尾的问题: 由开发人员决定何时初始化StructureMap。在Web应用程序中,这几乎总是在Application_Start()中的Global.asax中完成。在这种情况下,我希望在调用模块时容器就绪。