0

StructureMap を使用して、同じタイプの 2 つのインスタンスを 2 つの異なるスレッドに格納しようとしています。各スレッドには独自のインスタンスが必要です。

    [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マッピングを再構成しているため、これが表示されていると思います。2 回呼び出しObjectFactory.ConfigureITestObjectFactoryいますが、2 回目にすると、StructureMap は最初にこのマッピングをどのように構成したかを考慮しなくなります。

したがって、StructureMap が(クラスの) を与えtest2 = ObjectFactory.GetInstance<ITestObjectFactory>();た後に行うと、それが最後に構成された方法であるためです。t.Join();test1Test1

マッピングを一度だけ構成するテストを作成し、特定のインスタンスへのマッピングを構成するのではなく、クラスベースの構成を使用する方がおそらくより理にかなっています。いえ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
    {
    }
于 2012-06-11T14:37:09.377 に答える