使用混合生命周期定义的插件每个HttpContext实例化多次

时间:2011-02-16 15:52:55

标签: asp.net-mvc asp.net-mvc-2 .net-3.5 dependency-injection structuremap

我有一个标准的基于StructureMap的ControllerFactory设置,我有各种依赖项的控制器,每个依赖项都具有IRepository类型的依赖关系,如下所示:

// "web" assembly
public StructureMapRegistry : Registry 
{
    public StructureMapRegistry()
    {
        Scan(scanner =>
                     {
                         scanner.AssemblyContainingType<WidgetController>();
                         scanner.AssemblyContainingType<Repository>();
                         scanner.WithDefaultConventions();
                     });

        For<IRepository>().HybridHttpOrThreadLocalScoped().Use<Repository>();
    }
}

public WidgetController(IService1 service1, IService2 service2, Service3 service3)
{
    // etc, etc
}

// "data" assembly
public Service1 : IService1
{
    public Service1(IRepository repository)
    {
        // etc, etc
    }
}

public Service2 : IService2
{
    public Service2(IRepository repository)
    {
        // etc, etc
    }
}

public Service3
{
    public Service3(IRepository repository)
    {
        // etc, etc
    }
}

使用调试和GetHashCode()等,似乎在Repository时,每个服务中都有一个新的WidgetController被实例化,当我期望他们都使用相同的实例。

我误解了HybridHttpOrThreadLocalScoped()的作用吗?是因为我有时会传递具体的类而不是接口作为依赖,就像我在上面的代码中使用Service3一样(IRepository总是使用,而不是Repository的具体类)?我只是完全做错了吗?

(这段代码显然是从实际代码中推断出来的,所以我希望我没有遗漏任何重要的细节。)

注意:我使用的是StructureMap 2.6.1。

1 个答案:

答案 0 :(得分:0)

您发布的代码是正确的,您应该在整个请求中获取相同的IRepository实例。必须有其他事情没有包含在你的问题中......