StructureMap LifeCycle Является ли новый ThreadLocalStorageLifeCycle не локальным потоком?

Я пытаюсь сохранить два экземпляра одного типа в двух разных потоках с помощью StructureMap. У каждого потока должен быть свой экземпляр:

    [TestMethod]
    public void ThatObjectFactoryReturnsDifferentTypesFromTwoThreadsWhenConfiguredThreadLocalStorage()
    {
        var t = new Thread(ConfigureThreadLocalStorageTest1);
        ITestObjectFactory test2 = new Test2();
        ObjectFactory.Configure(x => x.For<ITestObjectFactory>().LifecycleIs(new ThreadLocalStorageLifecycle()).Use(test2));

        t.Start();
        t.Join();
        test2 = ObjectFactory.GetInstance<ITestObjectFactory>();

        Assert.IsInstanceOfType(test2, typeof(Test2));
        Assert.IsInstanceOfType(_staticTest, typeof(Test1));
    }

    static void ConfigureThreadLocalStorageTest1()
    {
        System.Diagnostics.Debug.WriteLine(ObjectFactory.TryGetInstance<ITestObjectFactory>());
        ITestObjectFactory test1 = new Test1();
        ObjectFactory.Configure(x => x.For<ITestObjectFactory>().LifecycleIs(new ThreadLocalStorageLifecycle()).Use(test1));

        _staticTest = ObjectFactory.GetInstance<ITestObjectFactory>();
    }
}

public class Test2 : ITestObjectFactory
{
}


public class Test1 : ITestObjectFactory
{
}

public interface ITestObjectFactory
{
}

Однако вышеуказанный тест не проходит. Кроме того, используя конфигурацию LifecycleIs (новый ThreadLocalStorage ()), я ожидал бы, что метод ObjectFactory.GetInstance () в ConfigureThreadLocalStorageTest1 вернет значение null?


person halcwb    schedule 09.06.2012    source источник
comment
Было бы неплохо, если бы вы могли нажать «Принять», если мой ответ отвечает на ваш вопрос! ;)   -  person Clafou    schedule 18.06.2012


Ответы (1)


Я предполагаю, что вы видите это, потому что вы перенастраиваете свое ITestObjectFactory отображение. Вы дважды вызываете ObjectFactory.Configure для ITestObjectFactory, и во второй раз StructureMap больше не принимает во внимание, как вы настроили это сопоставление в первый раз.

Следовательно, когда вы делаете test2 = ObjectFactory.GetInstance<ITestObjectFactory>(); после t.Join();, StructureMap дает вам test1 (класса Test1), так как это было настроено в последний раз.

Вероятно, было бы разумнее написать тест, который настраивает сопоставление только один раз и использовать конфигурацию на основе классов, а не настраивать сопоставление с конкретным экземпляром. Т.е. ObjectFactory.Configure(x => x.For<ITestObjectFactory>().LifecycleIs(new ThreadLocalStorageLifecycle()).Use<YourConcreteClass>();

ИЗМЕНИТЬ

Я изменил ваш код, как указано выше, и он действительно прошел!

    [TestMethod]
    public void ThatObjectFactoryReturnsDifferentTypesFromTwoThreadsWhenConfiguredThreadLocalStorage()
    {
        ObjectFactory.Configure(x => x.For<ITestObjectFactory>().LifecycleIs(new ThreadLocalStorageLifecycle()).Use<Test>());
        var test1 = ObjectFactory.GetInstance<ITestObjectFactory>();

        var t = new Thread(ConfigureThreadLocalStorageTest1);
        t.Start();
        t.Join();

        var test2 = ObjectFactory.GetInstance<ITestObjectFactory>();

        Assert.AreSame(test1, test2);
        Assert.AreNotSame(test1, _staticTest);
    }

    static void ConfigureThreadLocalStorageTest1()
    {
        System.Diagnostics.Debug.WriteLine(ObjectFactory.TryGetInstance<ITestObjectFactory>());
        _staticTest = ObjectFactory.GetInstance<ITestObjectFactory>();
    }

    private static ITestObjectFactory _staticTest;

    public class Test : ITestObjectFactory
    {
    }

    public interface ITestObjectFactory
    {
    }
person Clafou    schedule 11.06.2012