0

我正在尝试使用 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(new ThreadLocalStorage()) 配置,我希望 ConfigureThreadLocalStorageTest1 中的 ObjectFactory.GetInstance() 方法返回 null?

4

1 回答 1

0

我猜你看到这个是因为你正在重新配置你的ITestObjectFactory映射。您调用ObjectFactory.ConfigureITestObjectFactory两次,第二次调用时,StructureMap 不再考虑您第一次配置此映射的方式。

因此,当您test2 = ObjectFactory.GetInstance<ITestObjectFactory>();t.Join();StructureMap 给您test1(of class Test1) 之后执行此操作时,因为这是最后配置的方式。

编写一个只配置一次映射并使用基于类的配置而不是将映射配置到特定实例的测试可能更有意义。IEObjectFactory.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
    {
    }
于 2012-06-11T14:37:09.377 回答