diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs index d49cb6d142..a4f57b1b1f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs @@ -9,22 +9,36 @@ namespace Volo.Abp.AspNetCore.Mvc.DependencyInjection { public class AbpAspNetCoreMvcConventionalRegistrar : DefaultConventionalRegistrar { - protected override ServiceLifetime? GetServiceLifetimeFromClassHierarcy(Type type) + public override void AddType(IServiceCollection services, Type type) { - var lifeTime = base.GetServiceLifetimeFromClassHierarcy(type); - if (lifeTime != null) + if (!IsMvcService(type)) { - return lifeTime; + return; } - if (IsController(type) || - IsPageModel(type) || - IsViewComponent(type)) + var lifeTime = GetMvcServiceLifetime(type); + + var serviceTypes = ExposedServiceExplorer.GetExposedServices(type); + + TriggerServiceExposing(services, type, serviceTypes); + + foreach (var serviceType in serviceTypes) { - return ServiceLifetime.Transient; + var serviceDescriptor = ServiceDescriptor.Describe(serviceType, type, lifeTime); + services.Add(serviceDescriptor); } + } - return null; + protected virtual bool IsMvcService(Type type) + { + return IsController(type) || + IsPageModel(type) || + IsViewComponent(type); + } + + protected virtual ServiceLifetime GetMvcServiceLifetime(Type type) + { + return ServiceLifetime.Transient; } private static bool IsPageModel(Type type) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar_Tests.cs new file mode 100644 index 0000000000..46f2823b70 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalRegistrar_Tests.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.DependencyInjection; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.DependencyInjection +{ + public class AbpAspNetCoreMvcConventionalRegistrar_Tests + { + [Fact] + public void Should_Registered_Mvc_Service() + { + //Arrange + var services = new ServiceCollection(); + + //Act + services.AddConventionalRegistrar(new DefaultConventionalRegistrar()); + services.AddConventionalRegistrar(new AbpAspNetCoreMvcConventionalRegistrar()); + + services.AddTypes(typeof(My_Test_PageModel), typeof(My_Test_Controller), typeof(My_Test_ViewComponent)); + + //Assert + services.ShouldContainTransient(typeof(My_Test_PageModel)); + services.ShouldContainTransient(typeof(My_Test_Controller)); + services.ShouldContainTransient(typeof(My_Test_ViewComponent)); + + var serviceProvider = services.BuildServiceProvider(); + serviceProvider.GetServices().Count().ShouldBe(1); + serviceProvider.GetServices().Count().ShouldBe(1); + serviceProvider.GetServices().Count().ShouldBe(1); + } + } + + public class My_Test_PageModel : PageModel + { + + } + + public class My_Test_Controller : Controller + { + + } + + public class My_Test_ViewComponent : ViewComponent + { + + } +}