示例#1
0
        public virtual void SwitchInRootResolver(RootDependencyResolver value)
        {
            ResolverChain secondResolver = new ResolverChain();

            secondResolver.Add((IDbDependencyResolver)value);
            this._resolvers.Second.Resolvers.Skip <IDbDependencyResolver>(1).Each <IDbDependencyResolver>(new Action <IDbDependencyResolver>(secondResolver.Add));
            this._rootResolver = value;
            this._resolvers    = new CompositeResolver <ResolverChain, ResolverChain>(this._resolvers.First, secondResolver);
        }
示例#2
0
 public InternalConfiguration(
     ResolverChain appConfigChain                  = null,
     ResolverChain normalResolverChain             = null,
     RootDependencyResolver rootResolver           = null,
     AppConfigDependencyResolver appConfigResolver = null)
 {
     _rootResolver = rootResolver ?? new RootDependencyResolver();
     _resolvers    = new CompositeResolver <ResolverChain, ResolverChain>(appConfigChain ?? new ResolverChain(), normalResolverChain ?? new ResolverChain());
     _resolvers.Second.Add(_rootResolver);
     _resolvers.First.Add(appConfigResolver ?? new AppConfigDependencyResolver(AppConfig.DefaultInstance, this));
 }
            public void Adds_a_singleton_resolver_with_a_key()
            {
                var normalChain = new ResolverChain();

                new InternalConfiguration(
                    new Mock <ResolverChain>().Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock <AppConfigDependencyResolver>().Object).RegisterSingleton("Bilbo", "Baggins");

                Assert.Equal("Bilbo", normalChain.GetService <string>("Baggins"));
                Assert.Null(normalChain.GetService <string>("Biggins"));
            }
            public void Adds_a_singleton_resolver_with_a_key()
            {
                var normalChain = new ResolverChain();

                new InternalConfiguration(
                    new Mock<ResolverChain>().Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock<AppConfigDependencyResolver>().Object).RegisterSingleton("Bilbo", "Baggins");

                Assert.Equal("Bilbo", normalChain.GetService<string>("Baggins"));
                Assert.Null(normalChain.GetService<string>("Biggins"));
            }
            public void Adds_a_singleton_resolver_with_a_key_predicate()
            {
                var normalChain = new ResolverChain();

                new InternalConfiguration(
                    new Mock<ResolverChain>().Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock<AppConfigDependencyResolver>().Object).RegisterSingleton("Bilbo", k => ((string)k).StartsWith("B"));

                Assert.Equal("Bilbo", normalChain.GetService<string>("Baggins"));
                Assert.Equal("Bilbo", normalChain.GetService<string>("Biggins"));
                Assert.Null(normalChain.GetService<string>("More than half a Brandybuck"));
            }
            public void Adds_a_singleton_resolver_with_a_key_predicate()
            {
                var normalChain = new ResolverChain();

                new InternalConfiguration(
                    new Mock <ResolverChain>().Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock <AppConfigDependencyResolver>().Object).RegisterSingleton("Bilbo", k => ((string)k).StartsWith("B"));

                Assert.Equal("Bilbo", normalChain.GetService <string>("Baggins"));
                Assert.Equal("Bilbo", normalChain.GetService <string>("Biggins"));
                Assert.Null(normalChain.GetService <string>("More than half a Brandybuck"));
            }
示例#7
0
 public InternalConfiguration(
     ResolverChain appConfigChain                  = null,
     ResolverChain normalResolverChain             = null,
     RootDependencyResolver rootResolver           = null,
     AppConfigDependencyResolver appConfigResolver = null,
     Func <DbDispatchers> dispatchers              = null)
 {
     this._rootResolver = rootResolver ?? new RootDependencyResolver();
     this._resolvers    = new CompositeResolver <ResolverChain, ResolverChain>(appConfigChain ?? new ResolverChain(), normalResolverChain ?? new ResolverChain());
     this._resolvers.Second.Add((IDbDependencyResolver)this._rootResolver);
     this._resolvers.First.Add((IDbDependencyResolver)(appConfigResolver ?? new AppConfigDependencyResolver(AppConfig.DefaultInstance, this, (ProviderServicesFactory)null)));
     this._dispatchers = dispatchers ?? (Func <DbDispatchers>)(() => DbInterception.Dispatch);
 }
            public void RootResolver_is_added_to_the_non_app_config_resolver_chain()
            {
                var normalChain      = new ResolverChain();
                var mockRootResolver = new Mock <RootDependencyResolver>();

                new InternalConfiguration(
                    new Mock <ResolverChain>().Object,
                    normalChain, mockRootResolver.Object,
                    new Mock <AppConfigDependencyResolver>().Object);

                normalChain.GetService <object>("Foo");

                mockRootResolver.Verify(m => m.GetService(typeof(object), "Foo"));
            }
            public void All_interceptors_are_added_and_Loaded_interceptors_are_called_when_config_is_locked()
            {
                var mockAppConfigChain = new Mock <ResolverChain>();

                var interceptor1       = new Mock <IDbInterceptor>().Object;
                var interceptor2       = new Mock <IDbConfigurationInterceptor>().Object;
                var mockNormalResolver = new Mock <IDbDependencyResolver>();

                mockNormalResolver
                .Setup(m => m.GetServices(typeof(IDbInterceptor), null))
                .Returns(new[] { interceptor1, interceptor2 });

                var normalChain = new ResolverChain();

                normalChain.Add(mockNormalResolver.Object);

                var interceptor3       = new Mock <IDbConfigurationInterceptor>().Object;
                var mockLoadedResolver = new Mock <IDbDependencyResolver>();

                mockLoadedResolver
                .Setup(m => m.GetServices(typeof(IDbInterceptor), null))
                .Returns(new[] { interceptor3 });

                var mockDispatchers = new Mock <DbDispatchers>();
                var mockDispatcher  = new Mock <DbConfigurationDispatcher>();

                mockDispatchers.Setup(m => m.Configuration).Returns(mockDispatcher.Object);
                mockDispatcher
                .Setup(m => m.Loaded(It.IsAny <DbConfigurationLoadedEventArgs>(), It.IsAny <DbInterceptionContext>()))
                .Callback <DbConfigurationLoadedEventArgs, DbInterceptionContext>(
                    (a, _) => a.AddDependencyResolver(mockLoadedResolver.Object, false));

                var config = new InternalConfiguration(
                    mockAppConfigChain.Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock <AppConfigDependencyResolver>().Object,
                    () => mockDispatchers.Object);

                config.Lock();

                mockNormalResolver.Verify(m => m.GetServices(typeof(IDbInterceptor), null), Times.Exactly(2));
                mockLoadedResolver.Verify(m => m.GetServices(typeof(IDbInterceptor), null), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor1), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor2), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor3), Times.Once());

                mockDispatcher.Verify(
                    m => m.Loaded(It.IsAny <DbConfigurationLoadedEventArgs>(), It.IsAny <DbInterceptionContext>()));
            }
            public void GetService_returns_null_if_no_resolver_in_the_chain_resolves_the_dependency()
            {
                var mockResolver1 = CreateMockResolver("Steve", new Mock <IPilkington>().Object);
                var mockResolver2 = CreateMockResolver("Ricky", new Mock <IPilkington>().Object);

                var chain = new ResolverChain();

                chain.Add(mockResolver1.Object);
                chain.Add(mockResolver2.Object);

                Assert.Null(chain.GetService <IPilkington>("Karl"));

                mockResolver1.Verify(m => m.GetService(typeof(IPilkington), "Karl"), Times.Once());
                mockResolver2.Verify(m => m.GetService(typeof(IPilkington), "Karl"), Times.Once());
            }
            public void Resolvers_property_returns_resolvers_in_same_order_that_they_were_added()
            {
                var resolvers = new[]
                {
                    new Mock <IDbDependencyResolver>().Object,
                    new Mock <IDbDependencyResolver>().Object,
                    new Mock <IDbDependencyResolver>().Object,
                };

                var chain = new ResolverChain();

                resolvers.Each(chain.Add);

                Assert.Equal(resolvers, chain.Resolvers);
            }
示例#12
0
        /// <summary>
        ///     This method is not thread-safe and should only be used to switch in a different root resolver
        ///     before the configuration is locked and set. It is used for pushing a new configuration by
        ///     DbContextInfo while maintaining legacy settings (such as database initializers) that are
        ///     set on the root resolver.
        /// </summary>
        public virtual void SwitchInRootResolver(RootDependencyResolver value)
        {
            DebugCheck.NotNull(value);

            Debug.Assert(!_isLocked);

            // The following is not thread-safe but this code is only called when pushing a configuration
            // and happens to a new DbConfiguration before it has been set and locked.
            var newChain = new ResolverChain();

            newChain.Add(value);
            _resolvers.Second.Resolvers.Skip(1).Each(newChain.Add);

            _rootResolver = value;
            _resolvers    = new CompositeResolver <ResolverChain, ResolverChain>(_resolvers.First, newChain);
        }
            public void GetService_and_Add_can_be_accessed_from_multiple_threads_concurrently()
            {
                for (var i = 0; i < 30; i++)
                {
                    var bag      = new ConcurrentBag <IPilkington>();
                    var resolver = new ResolverChain();
                    var karl     = new Karl();

                    ExecuteInParallel(
                        () =>
                    {
                        resolver.Add(new SingletonDependencyResolver <IPilkington>(karl, "Karl"));
                        bag.Add(resolver.GetService <IPilkington>("Karl"));
                    });

                    Assert.Equal(20, bag.Count);
                    Assert.True(bag.All(c => karl == c));
                }
            }
            public void GetService_returns_the_service_returned_by_the_most_recently_added_resolver_that_resolves_the_dependency()
            {
                var karl = new Mock <IPilkington>().Object;

                var mockResolver1 = CreateMockResolver("Karl", new Mock <IPilkington>().Object);
                var mockResolver2 = CreateMockResolver("Karl", karl);
                var mockResolver3 = CreateMockResolver("Ricky", new Mock <IPilkington>().Object);

                var chain = new ResolverChain();

                chain.Add(mockResolver1.Object);
                chain.Add(mockResolver2.Object);
                chain.Add(mockResolver3.Object);

                Assert.Same(karl, chain.GetService <IPilkington>("Karl"));

                mockResolver1.Verify(m => m.GetService(typeof(IPilkington), "Karl"), Times.Never());
                mockResolver2.Verify(m => m.GetService(typeof(IPilkington), "Karl"), Times.Once());
                mockResolver3.Verify(m => m.GetService(typeof(IPilkington), "Karl"), Times.Once());
            }
            public void GetServices_registers_SQL_Server_as_a_fallback_if_it_is_not_already_registered()
            {
                var providerTypeName = string.Format(
                    CultureInfo.InvariantCulture,
                    "System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089",
                    new AssemblyName(typeof(DbContext).Assembly().FullName).Version);

                var mockSqlProvider = new Mock <DbProviderServices>();

                mockSqlProvider.Setup(m => m.GetService(typeof(string), null)).Returns("System.Data.SqlClient");

                var mockSection = CreateMockSectionWithProviders();
                var mockFactory = CreateMockFactory(mockSection.Object);

                mockFactory.Setup(m => m.TryGetInstance(providerTypeName))
                .Returns(mockSqlProvider.Object);

                var appConfig = new AppConfig(new ConnectionStringSettingsCollection(), null, mockSection.Object, mockFactory.Object);

                var mockConfiguration = new Mock <InternalConfiguration>(null, null, null, null, null);

                var someRandomThing = new Random();

                mockSqlProvider.Setup(m => m.GetService(typeof(Random), null)).Returns(someRandomThing);

                var resolvers = new ResolverChain();

                mockConfiguration.Setup(m => m.AddDefaultResolver(It.IsAny <IDbDependencyResolver>()))
                .Callback <IDbDependencyResolver>(resolvers.Add);

                new AppConfigDependencyResolver(appConfig, mockConfiguration.Object, mockFactory.Object).GetServices <IPilkington>();

                mockConfiguration.Verify(m => m.AddDefaultResolver(It.IsAny <DbProviderServices>()), Times.Exactly(4));
                mockConfiguration.Verify(
                    m => m.AddDefaultResolver(It.IsAny <SingletonDependencyResolver <DbProviderServices> >()), Times.Once());

                Assert.Equal("Robot.Rock", resolvers.GetService <string>());
                Assert.Same(someRandomThing, resolvers.GetService <Random>());
                Assert.Same(mockSqlProvider.Object, resolvers.GetService <DbProviderServices>("System.Data.SqlClient"));
            }
            public void GetServices_returns_all_the_services_that_match_the_given_type_and_key()
            {
                var karl1a        = new Mock <IPilkington>().Object;
                var karl1b        = new Mock <IPilkington>().Object;
                var mockResolver1 = new Mock <IDbDependencyResolver>();

                mockResolver1
                .Setup(m => m.GetServices(typeof(IPilkington), "Karl"))
                .Returns(new object[] { karl1a, karl1b });

                var karl2a        = new Mock <IPilkington>().Object;
                var karl2b        = new Mock <IPilkington>().Object;
                var mockResolver2 = new Mock <IDbDependencyResolver>();

                mockResolver2
                .Setup(m => m.GetServices(typeof(IPilkington), "Karl"))
                .Returns(new object[] { karl2a, karl2b });

                var mockResolver3 = CreateMockResolver("Ricky", new Mock <IPilkington>().Object);

                var chain = new ResolverChain();

                chain.Add(mockResolver1.Object);
                chain.Add(mockResolver2.Object);
                chain.Add(mockResolver3.Object);

                var pilkingtons = chain.GetServices <IPilkington>("Karl").ToList();

                Assert.Equal(4, pilkingtons.Count);
                Assert.Same(karl2a, pilkingtons[0]);
                Assert.Same(karl2b, pilkingtons[1]);
                Assert.Same(karl1a, pilkingtons[2]);
                Assert.Same(karl1b, pilkingtons[3]);

                mockResolver1.Verify(m => m.GetServices(typeof(IPilkington), "Karl"), Times.Once());
                mockResolver2.Verify(m => m.GetServices(typeof(IPilkington), "Karl"), Times.Once());
                mockResolver3.Verify(m => m.GetServices(typeof(IPilkington), "Karl"), Times.Once());
            }
            public void ResolverSnapshot_returns_resolvers_in_correct_order()
            {
                var callOrder = "";

                var configResolver = new Mock <IDbDependencyResolver>();

                configResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Config");
                var configChain = new ResolverChain();

                configChain.Add(configResolver.Object);

                var rootResolver = new Mock <RootDependencyResolver>();

                rootResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Root");

                var configuration = new DbConfiguration(
                    new InternalConfiguration(
                        configChain,
                        new ResolverChain(),
                        rootResolver.Object,
                        new Mock <AppConfigDependencyResolver>().Object)).InternalConfiguration;

                var normalResolver = new Mock <IDbDependencyResolver>();

                normalResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Normal");
                configuration.AddDependencyResolver(normalResolver.Object);

                var overrideResolver = new Mock <IDbDependencyResolver>();

                overrideResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Override");
                configuration.AddDependencyResolver(overrideResolver.Object, overrideConfigFile: true);

                configuration.ResolverSnapshot.GetService <object>("Foo");

                Assert.Equal(" Override Config Normal Root", callOrder);
            }
            public void ResolverSnapshot_returns_resolvers_in_correct_order()
            {
                var callOrder = "";

                var configResolver = new Mock<IDbDependencyResolver>();
                configResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Config");
                var configChain = new ResolverChain();
                configChain.Add(configResolver.Object);

                var rootResolver = new Mock<RootDependencyResolver>();
                rootResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Root");

                var configuration = new DbConfiguration(
                    new InternalConfiguration(
                        configChain,
                        new ResolverChain(),
                        rootResolver.Object,
                        new Mock<AppConfigDependencyResolver>().Object)).InternalConfiguration;

                var normalResolver = new Mock<IDbDependencyResolver>();
                normalResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Normal");
                configuration.AddDependencyResolver(normalResolver.Object);

                var overrideResolver = new Mock<IDbDependencyResolver>();
                overrideResolver.Setup(m => m.GetService(typeof(object), "Foo")).Callback(() => callOrder += " Override");
                configuration.AddDependencyResolver(overrideResolver.Object, overrideConfigFile: true);

                configuration.ResolverSnapshot.GetService<object>("Foo");

                Assert.Equal(" Override Config Normal Root", callOrder);
            }
            public void RootResolver_is_added_to_the_non_app_config_resolver_chain()
            {
                var normalChain = new ResolverChain();
                var mockRootResolver = new Mock<RootDependencyResolver>();

                new InternalConfiguration(
                    new Mock<ResolverChain>().Object,
                    normalChain, mockRootResolver.Object,
                    new Mock<AppConfigDependencyResolver>().Object);

                normalChain.GetService<object>("Foo");

                mockRootResolver.Verify(m => m.GetService(typeof(object), "Foo"));
            }
            public void All_interceptors_are_added_and_Loaded_interceptors_are_called_when_config_is_locked()
            {
                var mockAppConfigChain = new Mock<ResolverChain>();

                var interceptor1 = new Mock<IDbInterceptor>().Object;
                var interceptor2 = new Mock<IDbConfigurationInterceptor>().Object;
                var mockNormalResolver = new Mock<IDbDependencyResolver>();
                mockNormalResolver
                    .Setup(m => m.GetServices(typeof(IDbInterceptor), null))
                    .Returns(new[] { interceptor1, interceptor2 });

                var normalChain = new ResolverChain();
                normalChain.Add(mockNormalResolver.Object);

                var interceptor3 = new Mock<IDbConfigurationInterceptor>().Object;
                var mockLoadedResolver = new Mock<IDbDependencyResolver>();
                mockLoadedResolver
                    .Setup(m => m.GetServices(typeof(IDbInterceptor), null))
                    .Returns(new[] { interceptor3 });

                var mockDispatchers = new Mock<DbDispatchers>();
                var mockDispatcher = new Mock<DbConfigurationDispatcher>();
                mockDispatchers.Setup(m => m.Configuration).Returns(mockDispatcher.Object);
                mockDispatcher
                    .Setup(m => m.Loaded(It.IsAny<DbConfigurationLoadedEventArgs>(), It.IsAny<DbInterceptionContext>()))
                    .Callback<DbConfigurationLoadedEventArgs, DbInterceptionContext>(
                        (a, _) => a.AddDependencyResolver(mockLoadedResolver.Object, false));

                var config = new InternalConfiguration(
                    mockAppConfigChain.Object, normalChain,
                    new RootDependencyResolver(),
                    new Mock<AppConfigDependencyResolver>().Object,
                    () => mockDispatchers.Object);

                config.Lock();

                mockNormalResolver.Verify(m => m.GetServices(typeof(IDbInterceptor), null), Times.Exactly(2));
                mockLoadedResolver.Verify(m => m.GetServices(typeof(IDbInterceptor), null), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor1), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor2), Times.Once());
                mockDispatchers.Verify(m => m.AddInterceptor(interceptor3), Times.Once());

                mockDispatcher.Verify(
                    m => m.Loaded(It.IsAny<DbConfigurationLoadedEventArgs>(), It.IsAny<DbInterceptionContext>()));
            }