2012-06-09 1 views
0

두 개의 다른 스레드에서 동일한 유형의 인스턴스 두 개를 StructureMap을 사용하여 저장하려고합니다. 각 스레드는 자체 인스턴스가 있어야합니다.StructureMap LifeCycleIs 새로운 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 (new ThreadLocalStorage()) 구성을 사용하면 ConfigureThreadLocalStorageTest1의 ObjectFactory.GetInstance() 메서드가 null을 반환 할 것으로 예상됩니까?

+0

내 대답이 귀하의 질문에 대한 답변 인 경우 동의를 클릭해도 좋을까요? ;) – Clafou

답변

0

ITestObjectFactory 매핑을 다시 구성하기 때문에 표시되는 것 같습니다. ITestObjectFactory에 대해 ObjectFactory.Configure을 두 번 호출하고 두 번째 작업을 수행하면 처음으로이 매핑을 구성한 방법을 더 이상 고려하지 않습니다. 따라서

, 당신은 그것이 마지막으로 구성된 어떻게 이후 StructureMap 당신이 test1 (클래스 Test1의) 제공 test2 = ObjectFactory.GetInstance<ITestObjectFactory>();t.Join(); 후 수행 할 때.

매핑을 한 번만 구성하는 테스트를 작성하고 특정 인스턴스에 매핑을 구성하는 대신 클래스 기반 구성을 사용하는 것이 더 효과적 일 수 있습니다. 즉 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 
    { 
    }