diff --git a/src/Token.Module/Extensions/DependencyExtensions.cs b/src/Token.Module/Extensions/DependencyExtensions.cs index 285a755e600591acb3eda505d4d53443a615c048..eb6a862406ab927daeb67d16939310c98b85105c 100644 --- a/src/Token.Module/Extensions/DependencyExtensions.cs +++ b/src/Token.Module/Extensions/DependencyExtensions.cs @@ -12,11 +12,12 @@ public static class DependencyExtensions var assemblies = tokenModules.Select(x => x.GetType().Assembly).Distinct() .SelectMany(x => x.GetTypes()); + // 过滤程序集 var types = assemblies .Where(type => typeof(ISingletonDependency).IsAssignableFrom(type) || typeof(IScopedDependency).IsAssignableFrom(type) || typeof(ITransientDependency).IsAssignableFrom(type)); - + // 注入 foreach (var t in types) { var interfaces = t.GetInterfaces().Where(x => x.Name.EndsWith(t.Name))?.FirstOrDefault(); diff --git a/src/Token.Module/Extensions/ServiceCollectionApplicationExtensions.cs b/src/Token.Module/Extensions/ServiceCollectionApplicationExtensions.cs index f5678ac211599afaac7082446df5e2d5452e80da..be7b5107b0d3dca0f32077b8b79885a997b6ab57 100644 --- a/src/Token.Module/Extensions/ServiceCollectionApplicationExtensions.cs +++ b/src/Token.Module/Extensions/ServiceCollectionApplicationExtensions.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using System.Threading.Tasks; @@ -20,20 +21,13 @@ public static class ServiceCollectionApplicationExtensions { var types = new List(); var type = typeof(TModule); - var attributes = type.GetCustomAttributes().OfType() - .SelectMany(x => x.Type); + await GetModuleTypeAsync(type, types); - var module = type.Assembly.CreateInstance(type.FullName, true) as ITokenModule; - types.Add(module); - await module.ConfigureServicesAsync(services); - foreach (var t in attributes) + foreach (var t in types.Distinct()) { - if (t.Assembly.CreateInstance(t.FullName, true) is not ITokenModule ts) - continue; - - types.Add(ts); - await ts.ConfigureServicesAsync(services); + await t.ConfigureServicesAsync(services); } + services.AddSingleton(types); if (isAutoInject) { @@ -41,6 +35,35 @@ public static class ServiceCollectionApplicationExtensions } } + private static async Task GetModuleTypeAsync(Type type,List types) + { + var iTokenModule = typeof(ITokenModule); + if (!iTokenModule.IsAssignableFrom(type)) + { + return; + } + // 通过放射创建一个对象并且回调方法 + ITokenModule typeInstance = type.Assembly.CreateInstance(type.FullName, true) as ITokenModule; + + if (typeInstance != null) types.Add(typeInstance); + + // 获取DependOn特性注入的模块 + var attributes = type.GetCustomAttributes().OfType() + .SelectMany(x => x.Type).Where(x=>iTokenModule.IsAssignableFrom(x)); + + + foreach (var t in attributes) + { + ITokenModule module = t.Assembly.CreateInstance(t?.FullName, true) as ITokenModule; + if(module==null) + continue; + + types.Add(module); + // 可能存在循环依赖的问题 + await GetModuleTypeAsync(t, types); + } + } + /// /// 初始化Application /// diff --git a/src/Token.Module/Token.Module.csproj b/src/Token.Module/Token.Module.csproj index 3714e76cdae1ea4dac7b75713d63d46061ad41e5..34870dece84ad0dbc7e89860246c1a15912febe1 100644 --- a/src/Token.Module/Token.Module.csproj +++ b/src/Token.Module/Token.Module.csproj @@ -10,9 +10,9 @@ true https://github.com/239573049/token-module https://github.com/239573049/token-module - 修复Configure无法问题 + 修复子模块未依赖问题 logo.png - 1.1.7 + 1.1.8 diff --git a/test/NetCore.Application.Contracts/NetCoreApplicationContractsModule.cs b/test/NetCore.Application.Contracts/NetCoreApplicationContractsModule.cs index 777e577553e8dbe45175ca707964fd16d87b0c94..eba178328d1993e9ead4b4f601895ad808fe94be 100644 --- a/test/NetCore.Application.Contracts/NetCoreApplicationContractsModule.cs +++ b/test/NetCore.Application.Contracts/NetCoreApplicationContractsModule.cs @@ -1,8 +1,12 @@ -using Token.Module; +using Microsoft.Extensions.DependencyInjection; +using Token.Module; namespace NetCore.Application.Contracts; public class NetCoreApplicationContractsModule : TokenModule { - + public override void ConfigureServices(IServiceCollection services) + { + + } } \ No newline at end of file diff --git a/test/NetCore.HttpApi/NetCoreHttpApiModule.cs b/test/NetCore.HttpApi/NetCoreHttpApiModule.cs index b86ac895723497aa27f78f8668326698da407139..ee40535166ab25a2ae410fdd04df9990f858b04e 100644 --- a/test/NetCore.HttpApi/NetCoreHttpApiModule.cs +++ b/test/NetCore.HttpApi/NetCoreHttpApiModule.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using NetCore.Domain; using Token.Module; +using Token.Module.Attributes; namespace NetCore.HttpApi; @@ -16,6 +17,7 @@ public class NetCoreHttpApiModule : TokenModule ConfigCors(services); } + private void ConfigCors(IServiceCollection services) { services.AddCors(options =>