public void ReturnsTheSameObjectWhenCalledOnTheSameThread()
            {
                // arrange
                Func <A> factory = () => new A();
                var      threadStaticLifecycleManager = new ThreadStaticLifecycleManager <A>(factory);

                // act
                var a1 = threadStaticLifecycleManager.GetObject();
                var a2 = threadStaticLifecycleManager.GetObject();

                // assert
                Assert.Equal(a1, a2);
            }
            public void ReturnsDifferentObjectsWhenCalledOnDifferentThreads()
            {
                // arrange
                Func <A> factory = () => new A();
                var      threadStaticLifecycleManager = new ThreadStaticLifecycleManager <A>(factory);

                A a1 = null;
                A a2 = null;

                // act
                var thread1 = new Thread(() => a1 = threadStaticLifecycleManager.GetObject());
                var thread2 = new Thread(() => a2 = threadStaticLifecycleManager.GetObject());

                thread1.Start();
                thread2.Start();

                thread1.Join();
                thread2.Join();

                // assert
                Assert.NotEqual(a1, a2);
            }