From 589b42a20d003ac336f58173fa55e35601f189ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 8 Jan 2017 00:49:01 +0300 Subject: [PATCH] Create replaceservices option for dependency attribute. --- .../MultiTenantConnectionStringResolver.cs | 4 +-- .../Abp/MultiTenancy/AbpMultiTenancyModule.cs | 4 --- .../DefaultConventionalRegistrar.cs | 6 +++- .../DependencyAttribute.cs | 2 ++ ...onalDependencyInjectionExtensions_Tests.cs | 32 +++++++++++++++++++ 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs index be4d3717b0..98c02ac70e 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs @@ -5,9 +5,7 @@ using Volo.ExtensionMethods.Collections.Generic; namespace Volo.Abp.Data.MultiTenancy { - //TODO: Create a replace service registration convention, instead of custom registration in AbpMultiTenancyModule? - - [DisableConventionalRegistration] + [Dependency(ReplaceServices = true)] public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolver { private readonly IMultiTenancyManager _multiTenancyManager; diff --git a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs index a84833c8ad..d92f07bcf6 100644 --- a/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs +++ b/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs @@ -1,7 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Volo.Abp.Data; -using Volo.Abp.Data.MultiTenancy; using Volo.Abp.Modularity; namespace Volo.Abp.MultiTenancy @@ -10,7 +7,6 @@ namespace Volo.Abp.MultiTenancy { public override void ConfigureServices(IServiceCollection services) { - services.Replace(ServiceDescriptor.Transient()); services.AddAssemblyOf(); } } diff --git a/src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs b/src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs index ea52f82694..cd1e54e284 100644 --- a/src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs +++ b/src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs @@ -28,7 +28,11 @@ namespace Volo.DependencyInjection { var serviceDescriptor = ServiceDescriptor.Describe(serviceType, type, lifeTime.Value); - if (dependencyAttribute?.TryRegister == true) + if (dependencyAttribute?.ReplaceServices == true) + { + services.Replace(serviceDescriptor); + } + else if (dependencyAttribute?.TryRegister == true) { services.TryAdd(serviceDescriptor); } diff --git a/src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs b/src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs index 82b56ea1f2..4a3290cdf4 100644 --- a/src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs +++ b/src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs @@ -11,6 +11,8 @@ namespace Volo.DependencyInjection public virtual bool TryRegister { get; set; } + public virtual bool ReplaceServices { get; set; } + public DependencyAttribute() { diff --git a/test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs b/test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs index 367757b8f8..ac9817a47d 100644 --- a/test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs +++ b/test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs @@ -130,6 +130,32 @@ namespace Microsoft.Extensions.DependencyInjection instances[0].ShouldBeOfType(typeof(FirstImplOfMyService)); } + [Fact] + public void Should_Replace_First_Implementation_By_Second_If_Second_Marked_As_ReplaceServices() + { + //Act + + _services.AddTypes(typeof(FirstImplOfMyService), typeof(MyServiceReplacesIMyService)); + + //Assert + + //Check descriptons in service collection + var descriptions = _services.Where(s => s.ServiceType == typeof(IMyService)).ToList(); + descriptions.Count.ShouldBe(1); + descriptions[0].ImplementationType.ShouldBe(typeof(MyServiceReplacesIMyService)); + + //Check from service provider + var serviceProvider = _services.BuildServiceProvider(); + + //Default service should be second one + serviceProvider.GetRequiredService().ShouldBeOfType(typeof(MyServiceReplacesIMyService)); + + //Should also get all services + var instances = serviceProvider.GetServices().ToList(); + instances.Count.ShouldBe(1); + instances[0].ShouldBeOfType(typeof(MyServiceReplacesIMyService)); + } + [Fact] public void Should_Not_Register_Classes_Marked_With_DisableConventionalRegistration() { @@ -202,6 +228,12 @@ namespace Microsoft.Extensions.DependencyInjection public class MyServiceWithExposeList : IMyService1, IMyService2, ITransientDependency { + } + + [Dependency(ReplaceServices = true)] + public class MyServiceReplacesIMyService : IMyService + { + } public interface IMyService : ITransientDependency