From 383ca351418f79b3423d5cdcdb022fb2b2eb36e9 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Wed, 20 Oct 2021 14:19:12 +0300 Subject: [PATCH] Fixes #10375 - Implemented missing DependencyAttribute business for AspNetCore --- .../AbpAspNetCoreMvcConventionalRegistrar.cs | 57 ++++++++++++++++--- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar.cs index 2ef536db4d..8ebda7d580 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar.cs @@ -1,8 +1,11 @@ using System; +using System.Collections.Generic; +using System.Reflection; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.DependencyInjection @@ -22,22 +25,58 @@ namespace Volo.Abp.AspNetCore.Mvc.DependencyInjection } var lifeTime = GetMvcServiceLifetime(type); + var dependencyAttribute = GetDependencyAttributeOrNull(type); - var serviceTypes = ExposedServiceExplorer.GetExposedServices(type); + var exposedServiceTypes = GetExposedServiceTypes(type); - TriggerServiceExposing(services, type, serviceTypes); + TriggerServiceExposing(services, type, exposedServiceTypes); - foreach (var serviceType in serviceTypes) + foreach (var exposedServiceType in exposedServiceTypes) { - services.Add( - ServiceDescriptor.Describe( - serviceType, - type, - lifeTime - ) + var serviceDescriptor = CreateServiceDescriptor( + type, + exposedServiceType, + exposedServiceTypes, + lifeTime ); + + if (dependencyAttribute?.ReplaceServices == true) + { + services.Replace(serviceDescriptor); + } + else if (dependencyAttribute?.TryRegister == true) + { + services.TryAdd(serviceDescriptor); + } + else + { + services.Add(serviceDescriptor); + } } } + + protected virtual DependencyAttribute GetDependencyAttributeOrNull(Type type) + { + return type.GetCustomAttribute(true); + } + + protected virtual List GetExposedServiceTypes(Type type) + { + return ExposedServiceExplorer.GetExposedServices(type); + } + + protected virtual ServiceDescriptor CreateServiceDescriptor( + Type implementationType, + Type exposingServiceType, + List allExposingServiceTypes, + ServiceLifetime lifeTime) + { + return ServiceDescriptor.Describe( + exposingServiceType, + implementationType, + lifeTime + ); + } protected virtual bool IsMvcService(Type type) {