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()); }
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>())); }
/// <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>())); }
public virtual void AddDefaultResolver(IDbDependencyResolver resolver) { DebugCheck.NotNull(resolver); _defaultResolvers.Add(resolver); }
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 }