Синглтонное поведение StructureMap не работает - PullRequest
1 голос
/ 18 декабря 2009

Мой код

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 ]

1 голос
/ 22 января 2012

У меня та же проблема ... я использую контейнер структурной карты внутри фабрики и не могу заставить работать сингелтон.!

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

Кажется, он работает только для временно созданных объектов, но не для явно созданных объектов. (используя поиск в Google "временно, структура карты", вы должны найти что-то по этому поводу.)

То же самое относится к подконтейнерам:

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

и извлечение экземпляров из myIoc являются уникальными, но только до тех пор, пока они создаются временно ..

Меня просто смущает необходимость различать временно созданные объекты и другие объекты и кодировать их. Через десять лет никто больше не поймет этой разницы. Это должно быть проще, чем это.

1 голос
/ 18 декабря 2009

Я могу сделать несколько предположений, недостаточно знакомых с StructureMap, чтобы сделать вызов. Вы очень поздно вызываете BootstrapStructureMap () в вашем методе main (). Обязательно вызовите его, прежде чем вызывать ServiceBase.Run ().

Кроме того, будьте осторожны с привязкой потоков к фабрике объектов. Обычно код службы выполняется в потоке потоков, отличном от потока, выполняющего метод main (). Если StructureMap хранит синглтон в элементе [ThreadStatic], вы получите отдельный экземпляр для каждого потока. Просматривая исходный код StructureMap, это вряд ли является причиной.

...