From ca0dd01485c73bd124e6f14662cc9d49beb3ef51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 4 Dec 2016 22:03:20 +0300 Subject: [PATCH] Added IExposedServiceTypesProvider --- ...nventionalDependencyInjectionExtensions.cs | 10 +++++-- .../ExposeServicesAttribute.cs | 19 ++++++++++++++ .../IExposedServiceTypesProvider.cs | 9 +++++++ ...onalDependencyInjectionExtensions_Tests.cs | 26 +++++++++++++++++++ .../ServiceCollectionShouldlyExtensions.cs | 18 +++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/Volo.DependencyInjection/DependencyInjection/ExposeServicesAttribute.cs create mode 100644 src/Volo.DependencyInjection/DependencyInjection/IExposedServiceTypesProvider.cs diff --git a/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs b/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs index 3ede37227d..ad4f3df41f 100644 --- a/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs +++ b/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs @@ -34,7 +34,7 @@ namespace Volo.DependencyInjection { //TODO: Make this code extensible, so we can add other conventions! - foreach (var serviceType in FindDefaultServiceTypes(type)) + foreach (var serviceType in FindServiceTypes(type)) { if (typeof(ITransientDependency).GetTypeInfo().IsAssignableFrom(type)) { @@ -53,8 +53,14 @@ namespace Volo.DependencyInjection } } - private static List FindDefaultServiceTypes(Type type) + private static List FindServiceTypes(Type type) { + var customExposedServices = type.GetTypeInfo().GetCustomAttributes().OfType().SelectMany(p => p.GetExposedServiceTypes()).ToList(); + if (customExposedServices.Any()) + { + return customExposedServices; + } + var serviceTypes = new List(); serviceTypes.Add(type); diff --git a/src/Volo.DependencyInjection/DependencyInjection/ExposeServicesAttribute.cs b/src/Volo.DependencyInjection/DependencyInjection/ExposeServicesAttribute.cs new file mode 100644 index 0000000000..276bf25d9f --- /dev/null +++ b/src/Volo.DependencyInjection/DependencyInjection/ExposeServicesAttribute.cs @@ -0,0 +1,19 @@ +using System; + +namespace Volo.DependencyInjection +{ + public class ExposeServicesAttribute : Attribute, IExposedServiceTypesProvider + { + public Type[] ExposedServiceTypes { get; } + + public ExposeServicesAttribute(params Type[] exposedServiceTypes) + { + ExposedServiceTypes = exposedServiceTypes; + } + + public Type[] GetExposedServiceTypes() + { + return ExposedServiceTypes; + } + } +} \ No newline at end of file diff --git a/src/Volo.DependencyInjection/DependencyInjection/IExposedServiceTypesProvider.cs b/src/Volo.DependencyInjection/DependencyInjection/IExposedServiceTypesProvider.cs new file mode 100644 index 0000000000..e78ddd2040 --- /dev/null +++ b/src/Volo.DependencyInjection/DependencyInjection/IExposedServiceTypesProvider.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.DependencyInjection +{ + public interface IExposedServiceTypesProvider + { + Type[] GetExposedServiceTypes(); + } +} diff --git a/test/Volo.DependencyInjection.Tests/AbpConventionalDependencyInjectionExtensions_Tests.cs b/test/Volo.DependencyInjection.Tests/AbpConventionalDependencyInjectionExtensions_Tests.cs index 4d192ef531..520492b2d3 100644 --- a/test/Volo.DependencyInjection.Tests/AbpConventionalDependencyInjectionExtensions_Tests.cs +++ b/test/Volo.DependencyInjection.Tests/AbpConventionalDependencyInjectionExtensions_Tests.cs @@ -42,6 +42,16 @@ namespace Volo.DependencyInjection.Tests _services.ShouldContainScoped(typeof(MyScopedClass)); } + [Fact] + public void Should_Register_For_Exposed_Services() + { + _services.AddType(typeof(MyServiceWithExposeList)); + + _services.ShouldContain(typeof(IMyService1), typeof(MyServiceWithExposeList), ServiceLifetime.Transient); + _services.ShouldContain(typeof(IMyService2), typeof(MyServiceWithExposeList), ServiceLifetime.Transient); + _services.ShouldNotContain(typeof(MyServiceWithExposeList)); + } + public class MyTransientClass : ITransientDependency { @@ -56,5 +66,21 @@ namespace Volo.DependencyInjection.Tests { } + + public interface IMyService1 + { + + } + + public interface IMyService2 + { + + } + + [ExposeServices(typeof(IMyService1), typeof(IMyService2))] + public class MyServiceWithExposeList : IMyService1, IMyService2, ITransientDependency + { + + } } } diff --git a/test/Volo.DependencyInjection.Tests/ServiceCollectionShouldlyExtensions.cs b/test/Volo.DependencyInjection.Tests/ServiceCollectionShouldlyExtensions.cs index 9761102b35..71b3edb830 100644 --- a/test/Volo.DependencyInjection.Tests/ServiceCollectionShouldlyExtensions.cs +++ b/test/Volo.DependencyInjection.Tests/ServiceCollectionShouldlyExtensions.cs @@ -39,5 +39,23 @@ namespace Volo.DependencyInjection.Tests serviceDescriptor.ImplementationInstance.ShouldBeNull(); serviceDescriptor.Lifetime.ShouldBe(ServiceLifetime.Scoped); } + + public static void ShouldContain(this IServiceCollection services, Type serviceType, Type implementationType, ServiceLifetime lifetime) + { + var serviceDescriptor = services.FirstOrDefault(s => s.ServiceType == serviceType); + + serviceDescriptor.ShouldNotBeNull(); + serviceDescriptor.ImplementationType.ShouldBe(implementationType); + serviceDescriptor.ImplementationFactory.ShouldBeNull(); + serviceDescriptor.ImplementationInstance.ShouldBeNull(); + serviceDescriptor.Lifetime.ShouldBe(lifetime); + } + + public static void ShouldNotContain(this IServiceCollection services, Type serviceType) + { + var serviceDescriptor = services.FirstOrDefault(s => s.ServiceType == serviceType); + + serviceDescriptor.ShouldBeNull(); + } } } \ No newline at end of file