Browse Source

Create replaceservices option for dependency attribute.

pull/81/head
Halil İbrahim Kalkan 10 years ago
parent
commit
589b42a20d
  1. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs
  2. 4
      src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs
  3. 6
      src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs
  4. 2
      src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs
  5. 32
      test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs

4
src/Volo.Abp.MultiTenancy/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver.cs

@ -5,9 +5,7 @@ using Volo.ExtensionMethods.Collections.Generic;
namespace Volo.Abp.Data.MultiTenancy namespace Volo.Abp.Data.MultiTenancy
{ {
//TODO: Create a replace service registration convention, instead of custom registration in AbpMultiTenancyModule? [Dependency(ReplaceServices = true)]
[DisableConventionalRegistration]
public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolver public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolver
{ {
private readonly IMultiTenancyManager _multiTenancyManager; private readonly IMultiTenancyManager _multiTenancyManager;

4
src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs

@ -1,7 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Data;
using Volo.Abp.Data.MultiTenancy;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp.MultiTenancy namespace Volo.Abp.MultiTenancy
@ -10,7 +7,6 @@ namespace Volo.Abp.MultiTenancy
{ {
public override void ConfigureServices(IServiceCollection services) public override void ConfigureServices(IServiceCollection services)
{ {
services.Replace(ServiceDescriptor.Transient<IConnectionStringResolver, MultiTenantConnectionStringResolver>());
services.AddAssemblyOf<AbpMultiTenancyModule>(); services.AddAssemblyOf<AbpMultiTenancyModule>();
} }
} }

6
src/Volo.DependencyInjection/Volo/DependencyInjection/DefaultConventionalRegistrar.cs

@ -28,7 +28,11 @@ namespace Volo.DependencyInjection
{ {
var serviceDescriptor = ServiceDescriptor.Describe(serviceType, type, lifeTime.Value); 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); services.TryAdd(serviceDescriptor);
} }

2
src/Volo.DependencyInjection/Volo/DependencyInjection/DependencyAttribute.cs

@ -11,6 +11,8 @@ namespace Volo.DependencyInjection
public virtual bool TryRegister { get; set; } public virtual bool TryRegister { get; set; }
public virtual bool ReplaceServices { get; set; }
public DependencyAttribute() public DependencyAttribute()
{ {

32
test/Volo.DependencyInjection.Tests/Microsoft/Extensions/DependencyInjection/AbpConventionalDependencyInjectionExtensions_Tests.cs

@ -130,6 +130,32 @@ namespace Microsoft.Extensions.DependencyInjection
instances[0].ShouldBeOfType(typeof(FirstImplOfMyService)); 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<IMyService>().ShouldBeOfType(typeof(MyServiceReplacesIMyService));
//Should also get all services
var instances = serviceProvider.GetServices<IMyService>().ToList();
instances.Count.ShouldBe(1);
instances[0].ShouldBeOfType(typeof(MyServiceReplacesIMyService));
}
[Fact] [Fact]
public void Should_Not_Register_Classes_Marked_With_DisableConventionalRegistration() public void Should_Not_Register_Classes_Marked_With_DisableConventionalRegistration()
{ {
@ -202,6 +228,12 @@ namespace Microsoft.Extensions.DependencyInjection
public class MyServiceWithExposeList : IMyService1, IMyService2, ITransientDependency public class MyServiceWithExposeList : IMyService1, IMyService2, ITransientDependency
{ {
}
[Dependency(ReplaceServices = true)]
public class MyServiceReplacesIMyService : IMyService
{
} }
public interface IMyService : ITransientDependency public interface IMyService : ITransientDependency

Loading…
Cancel
Save