Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StructureMap没有';在HttpModule构造过程中似乎没有准备好——这是正确的吗?_C#_.net_Structuremap_Httpmodule_Race Condition - Fatal编程技术网

C# StructureMap没有';在HttpModule构造过程中似乎没有准备好——这是正确的吗?

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); }

这个问题更多的是为了证实我对我们遇到的问题的诊断——或者寻找其他解释

我们有一个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; }
}
所以,我的朋友,我有一些关于这种行为的问题:

  • 我怀疑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;
    }
}