private static void VerifyServiceIsCached <T>(
                T service,
                CachingDependencyResolver cachingResolver,
                Mock <IDbDependencyResolver> mockResolver,
                string name)
            {
                mockResolver.Setup(m => m.GetService(typeof(T), name)).Returns(service);

                Assert.Same(service, cachingResolver.GetService <T>(name));
                mockResolver.Verify(m => m.GetService(typeof(T), name), Times.Once());
                Assert.Same(service, cachingResolver.GetService <T>(name));
                mockResolver.Verify(m => m.GetService(typeof(T), name), Times.Once()); // Underlying resolver not called again
            }
            public void GetService_can_be_accessed_from_multiple_threads_concurrently()
            {
                for (var i = 0; i < 30; i++)
                {
                    var bag      = new ConcurrentBag <IPilkington>();
                    var karl     = new Mock <IPilkington>().Object;
                    var resolver = new CachingDependencyResolver(new SingletonDependencyResolver <IPilkington>(karl));

                    ExecuteInParallel(() => bag.Add(resolver.GetService <IPilkington>()));

                    Assert.Equal(20, bag.Count);
                    Assert.True(bag.All(c => karl == c));
                }
            }