StructureMap单例行为不起作用

时间:2009-12-18 12:09:55

标签: c# inversion-of-control singleton structuremap

我的代码是

public static class ContainerBootstrapper
{
    public static void BootstrapStructureMap()
    {

        ObjectFactory.Initialize(x => x
                      .ForRequestedType<ValueHolder>()
                      .CacheBy(InstanceScope.Singleton)
                      .TheDefaultIsConcreteType<ValueHolder>());
    }
} 

初始化代码(它是一个Windows服务)

static class Program
{
    static void Main()
    {

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
            { 
             new AppServer() 
            };
        ServiceBase.Run(ServicesToRun);

        ContainerBootstrapper.BootstrapStructureMap();

    }
}

然后我调用这样的实例:

var valueHolder = ObjectFactory.GetInstance<ValueHolder>();

但我每次都会得到一个新的实例而不是之前使用过的实例。

2 个答案:

答案 0 :(得分:1)

我可以做一些猜测,不熟悉StructureMap来进行调用。你在main()方法中调用BootstrapStructureMap()已经很晚了。在调用ServiceBase.Run()之前一定要调用它。

另外,请注意对象工厂的线程关联性。服务中的代码在线程池线程上运行是很常见的,线程池线程与执行main()方法的线程不同。如果StructureMap将单例存储在[ThreadStatic]成员中,您将为每个线程获得不同的实例。浏览StructureMap源代码,这不太可能是原因。

答案 1 :(得分:1)

我遇到了同样的问题..我正在工厂内使用结构图容器,也无法让singelton工作。

For<IServiceD>().Singleton().Use<ServiceD>();

它似乎只适用于瞬态创建的对象,但不适用于显式创建的对象。 (使用谷歌搜索“暂时,结构图”你应该找到一些东西。)

这同样适用于子容器:

private IContainer myParentContainer;
private IContainer myIoc;
...
myIoc = myParentContainer.GetNestedContainer(); 

然后将实例拉出myIoc是唯一的,但只要它们是瞬时创建的..

我只是发现它必须区分瞬态创建的对象和其他工具并围绕这个进行编码而感到困惑。从现在开始的十年内,没有人会再理解这种差异了。它需要比这更简单。