2012-06-09 2 views
0

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

[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?

+0

Было бы неплохо, если бы вы могли нажать «Принять», если мой ответ ответит на ваш вопрос! ;) – Clafou

ответ

0

Я думаю, вы видите это, потому что вы переконфигурируете свое отображение 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>();

EDIT

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

[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 
    { 
    } 
Смежные вопросы