Beispiel #1
0
        public virtual void SetDefaultProviderServices(DbProviderServices provider, string invariantName)
        {
            DebugCheck.NotNull(provider);
            DebugCheck.NotEmpty(invariantName);

            _defaultProviderResolvers.Add(new SingletonDependencyResolver <DbProviderServices>(provider, invariantName));
            _defaultProviderResolvers.Add(provider);
        }
            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());
            }
Beispiel #3
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);
        }
            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_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 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>()));
            }
Beispiel #7
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 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 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>()));
            }
Beispiel #12
0
        public virtual void AddDefaultResolver(IDbDependencyResolver resolver)
        {
            DebugCheck.NotNull(resolver);

            _defaultResolvers.Add(resolver);
        }
Beispiel #13
0
        public RootDependencyResolver(
            DefaultProviderServicesResolver defaultProviderServicesResolver,
            DatabaseInitializerResolver databaseInitializerResolver)
        {
            DebugCheck.NotNull(defaultProviderServicesResolver);
            DebugCheck.NotNull(databaseInitializerResolver);

            _databaseInitializerResolver = databaseInitializerResolver;

            _resolvers.Add(new TransactionContextInitializerResolver());
            _resolvers.Add(_databaseInitializerResolver);
            _resolvers.Add(new DefaultExecutionStrategyResolver());
            _resolvers.Add(new CachingDependencyResolver(defaultProviderServicesResolver));
            _resolvers.Add(new CachingDependencyResolver(new DefaultProviderFactoryResolver()));
            _resolvers.Add(new CachingDependencyResolver(new DefaultInvariantNameResolver()));
            _resolvers.Add(new SingletonDependencyResolver <IDbConnectionFactory>(new LocalDbConnectionFactory()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbContext, IDbModelCacheKey> >(new DefaultModelCacheKeyFactory().Create));
            _resolvers.Add(new SingletonDependencyResolver <IManifestTokenResolver>(new DefaultManifestTokenResolver()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbConnection, string, HistoryContext> >(HistoryContext.DefaultFactory));
            _resolvers.Add(new SingletonDependencyResolver <IPluralizationService>(new EnglishPluralizationService()));
            _resolvers.Add(new SingletonDependencyResolver <AttributeProvider>(new AttributeProvider()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbContext, Action <string>, DatabaseLogFormatter> >((c, w) => new DatabaseLogFormatter(c, w)));
            _resolvers.Add(new SingletonDependencyResolver <Func <TransactionHandler> >(() => new DefaultTransactionHandler(), k => k is ExecutionStrategyKey));

#if NET40
            _resolvers.Add(new SingletonDependencyResolver <IDbProviderFactoryResolver>(new Net40DefaultDbProviderFactoryResolver()));
#else
            _resolvers.Add(new SingletonDependencyResolver <IDbProviderFactoryResolver>(new DefaultDbProviderFactoryResolver()));
#endif
            _resolvers.Add(new SingletonDependencyResolver <Func <IMetadataAnnotationSerializer> >(
                               () => new ClrTypeAnnotationSerializer(), XmlConstants.ClrTypeAnnotation));
            _resolvers.Add(new SingletonDependencyResolver <Func <IMetadataAnnotationSerializer> >(
                               () => new IndexAnnotationSerializer(), IndexAnnotation.AnnotationName));
        }
        public virtual void AddSecondaryResolver(IDbDependencyResolver resolver)
        {
            DebugCheck.NotNull(resolver);

            _secondaryResolvers.Add(resolver);
        }
        public RootDependencyResolver(
            DefaultProviderServicesResolver defaultProviderServicesResolver,
            DatabaseInitializerResolver databaseInitializerResolver)
        {
            DebugCheck.NotNull(defaultProviderServicesResolver);
            DebugCheck.NotNull(databaseInitializerResolver);

            _databaseInitializerResolver = databaseInitializerResolver;

            _resolvers.Add(_databaseInitializerResolver);
            _resolvers.Add(new DefaultExecutionStrategyResolver());
            _resolvers.Add(new CachingDependencyResolver(defaultProviderServicesResolver));
            _resolvers.Add(new CachingDependencyResolver(new DefaultProviderFactoryResolver()));
            _resolvers.Add(new CachingDependencyResolver(new DefaultInvariantNameResolver()));
            _resolvers.Add(new SingletonDependencyResolver <IDbConnectionFactory>(new SqlConnectionFactory()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbContext, IDbModelCacheKey> >(new DefaultModelCacheKeyFactory().Create));
            _resolvers.Add(new SingletonDependencyResolver <IManifestTokenResolver>(new DefaultManifestTokenResolver()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbConnection, string, HistoryContext> >(HistoryContext.DefaultFactory));
            _resolvers.Add(new SingletonDependencyResolver <IPluralizationService>(new EnglishPluralizationService()));
            _resolvers.Add(new SingletonDependencyResolver <AttributeProvider>(new AttributeProvider()));
            _resolvers.Add(new SingletonDependencyResolver <Func <DbContext, Action <string>, DbCommandLogger> >((c, w) => new DbCommandLogger(c, w)));

#if NET40
            _resolvers.Add(new SingletonDependencyResolver <IDbProviderFactoryResolver>(new Net40DefaultDbProviderFactoryResolver()));
#else
            _resolvers.Add(new SingletonDependencyResolver <IDbProviderFactoryResolver>(new DefaultDbProviderFactoryResolver()));
#endif
        }