BFS+倒置遍历完成模块化依赖功能

This commit is contained in:
橙子
2023-01-17 17:50:15 +08:00
parent 617fbdf8f7
commit f68ffefaa9
22 changed files with 192 additions and 203 deletions

View File

@@ -2,11 +2,16 @@
using Microsoft.Extensions.DependencyInjection;
using StartupModules;
using Yi.Framework.Autofac.Extensions;
using Yi.Framework.Core.Attributes;
namespace Yi.Framework.Core.AutoMapper
{
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkCoreAutoMapperModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)
{
}

View File

@@ -23,6 +23,7 @@ namespace Yi.Framework.Core.Autofac.Extensions
switch (autoFacModuleEnum)
{
case AutoFacModuleEnum.PropertiesAutowiredModule:
Console.WriteLine($"意框架添加AutoFac模块{nameof(PropertiesAutowiredModule)}-属性注入模块");
new PropertiesAutowiredModule().Load(builder, assemblies);
break;
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Attributes
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class DependsOnAttribute : Attribute
{
public Type[] DependedTypes { get; }
public DependsOnAttribute(params Type[] dependedTypes)
{
DependedTypes = dependedTypes ?? new Type[0];
}
public virtual Type[] GetDependedTypes()
{
return DependedTypes;
}
}
}

View File

@@ -10,6 +10,7 @@ using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Module;
namespace Yi.Framework.Core.Extensions
{
@@ -19,172 +20,17 @@ namespace Yi.Framework.Core.Extensions
/// </summary>
public static class ModuleExtensions
{
//
// 摘要:
// Configures startup modules and automatically discovers StartupModules.IStartupModule's
// from the applications entry assembly.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
//
// 返回结果:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
public static IWebHostBuilder UseYiModules(this IWebHostBuilder builder)
public static WebApplicationBuilder UseYiModules(this WebApplicationBuilder builder, Type startType)
{
return builder.UseStartupModules(delegate (StartupModulesOptions options)
{
options.DiscoverStartupModules();
});
}
//
// 摘要:
// Configures startup modules and automatically discovers StartupModules.IStartupModule's
// from the specified assemblies.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
//
// assemblies:
// The assemblies to discover startup modules from.
//
// 返回结果:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
public static IWebHostBuilder UseYiModules(this IWebHostBuilder builder, params Assembly[] assemblies)
{
Assembly[] assemblies2 = assemblies;
var moduleManager = new ModuleManager(startType);
moduleManager.Invoker();
Assembly[] assemblies2 = moduleManager.ToAssemblyArray();
return builder.UseStartupModules(delegate (StartupModulesOptions options)
{
options.DiscoverStartupModules(assemblies2);
});
}
//
// 摘要:
// Configures startup modules with the specified configuration for StartupModules.StartupModulesOptions.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
//
// configure:
// A callback to configure StartupModules.StartupModulesOptions.
//
// 返回结果:
// The Microsoft.AspNetCore.Hosting.IWebHostBuilder instance.
public static IWebHostBuilder UseYiModules(this IWebHostBuilder builder, Action<StartupModulesOptions> configure)
{
Action<StartupModulesOptions> configure2 = configure;
return builder.ConfigureServices(delegate (WebHostBuilderContext hostContext, IServiceCollection services)
{
services.AddStartupModules(hostContext.Configuration, hostContext.HostingEnvironment, configure2);
});
}
//
// 摘要:
// Configures startup modules with the specified configuration for StartupModules.StartupModulesOptions.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
//
// 返回结果:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
public static WebApplicationBuilder UseYiModules(this WebApplicationBuilder builder)
{
return builder.UseStartupModules(delegate (StartupModulesOptions options)
{
options.DiscoverStartupModules();
});
}
//
// 摘要:
// Configures startup modules with the specified configuration for StartupModules.StartupModulesOptions.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
//
// assemblies:
// The assemblies to discover startup modules from.
//
// 返回结果:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
public static WebApplicationBuilder UseYiModules(this WebApplicationBuilder builder, params Assembly[] assemblies)
{
Assembly[] assemblies2 = assemblies;
return builder.UseStartupModules(delegate (StartupModulesOptions options)
{
options.DiscoverStartupModules(assemblies2);
});
}
//
// 摘要:
// Configures startup modules with the specified configuration for StartupModules.StartupModulesOptions.
//
// 参数:
// builder:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
//
// configure:
// A callback to configure StartupModules.StartupModulesOptions.
//
// 返回结果:
// The Microsoft.AspNetCore.Builder.WebApplicationBuilder instance.
public static WebApplicationBuilder UseYiModules(this WebApplicationBuilder builder, Action<StartupModulesOptions> configure)
{
builder.Services.AddStartupModules(builder.Configuration, builder.Environment, configure);
return builder;
}
//
// 摘要:
// Configures startup modules with the specified configuration for StartupModules.StartupModulesOptions.
//
// 参数:
// services:
// The service collection to add the StartupModules services to.
//
// configuration:
// The application's configuration.
//
// environment:
// The application's environment information.
//
// configure:
// A callback to configure StartupModules.StartupModulesOptions.
public static void AddYiModules(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment, Action<StartupModulesOptions> configure)
{
if (services == null)
{
throw new ArgumentNullException("services");
}
if (configuration == null)
{
throw new ArgumentNullException("configuration");
}
if (environment == null)
{
throw new ArgumentNullException("environment");
}
StartupModulesOptions startupModulesOptions = new StartupModulesOptions();
configure(startupModulesOptions);
if (startupModulesOptions.StartupModules.Count != 0 || startupModulesOptions.ApplicationInitializers.Count != 0)
{
StartupModuleRunner runner = new StartupModuleRunner(startupModulesOptions);
services.AddSingleton((Func<IServiceProvider, IStartupFilter>)((IServiceProvider sp) => ActivatorUtilities.CreateInstance<ModulesStartupFilter>(sp, new object[1] { runner })));
new ConfigureServicesContext(configuration, environment, startupModulesOptions);
runner.ConfigureServices(services, configuration, environment);
}
}
}
}

View File

@@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
namespace Yi.Framework.Core.Module
{
internal class ModuleManager
{
private List<Type> ResultType = new List<Type>();
private Type StartType;
public ModuleManager(Type startType)
{
StartType = startType;
}
public List<Type> Invoker()
{
StartBFSNodes(StartType);
var result= RemoveDuplicate(ResultType);
foreach (var r in result)
{
Console.WriteLine($"意框架正在加载模块:{r.Name}");
}
return result;
}
private Type[]? GetDependsOnType(Type type)
{
var dependsOnbuild = type.GetCustomAttributes(typeof(DependsOnAttribute), false).FirstOrDefault() as DependsOnAttribute;
if (dependsOnbuild is null)
{
return new Type[0];
}
return dependsOnbuild.GetDependedTypes();
}
private void StartBFSNodes(Type node)
{
ResultType.Add(node);
var nodes = GetDependsOnType(node);
if (nodes is not null && nodes.Count() != 0)
{
foreach (var n in nodes)
{
StartBFSNodes(n);
}
}
}
private List<Type> RemoveDuplicate(List<Type> array)
{
HashSet<Type> s = new HashSet<Type>();
List<Type> list = new List<Type>();
for (int i = array.Count - 1; i >= 0; i--)
{
if (!s.Contains(array[i]))
{
s.Add(array[i]);
list.Add(array[i]);
}
}
ResultType = list;
return list;
}
public List<Assembly> ToAssemblyList()
{
return ResultType.Select(a => a.Assembly).ToList();
}
public Assembly[] ToAssemblyArray()
{
return ResultType.Select(a => a.Assembly).ToArray();
}
}
}

View File

@@ -6,12 +6,6 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Module\**" />
<EmbeddedResource Remove="Module\**" />
<None Remove="Module\**" />
</ItemGroup>
<ItemGroup>
<Folder Include="Options\" />
</ItemGroup>

View File

@@ -6,9 +6,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Core.AutoMapper;
namespace Yi.Framework.Ddd
{
[DependsOn(
typeof(YiFrameworkCoreAutoMapperModule)
)]
public class YiFrameworkDddModule:IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -8,9 +8,14 @@ using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Caching.MemoryCache;
using Yi.Framework.Caching;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Core;
namespace Yi.Framework.Ddd
{
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkCachingMemoryCacheModule:IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -1,11 +1,15 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using StartupModules;
using Yi.Framework.Core;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Core.Configuration;
namespace Yi.Framework.Caching.Redis
{
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkCachingRedisModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -6,9 +6,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core;
using Yi.Framework.Core.Attributes;
namespace Yi.Framework.Office.Excel
{
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkOfficeExcelModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -8,7 +8,7 @@ using Yi.Framework.WeChatPay.Helper;
namespace Yi.Framework.WeChatPay.Domain
{
public interface IPayInvoker
public interface IPayManager
{
/// <summary>
/// 获取WX支付链接的方法

View File

@@ -11,13 +11,13 @@ using Yi.Framework.WeChatPay.Options;
namespace Yi.Framework.WeChatPay.Domain
{
public class PayInvoker : IPayInvoker
public class PayManager : IPayManager
{
private readonly PayHelper _payHelper;
private readonly ILogger<PayInvoker> _logger;
private readonly ILogger<PayManager> _logger;
private readonly AbstractNotify _notify;
public PayInvoker(PayHelper payHelper, ILogger<PayInvoker> logger, AbstractNotify notify)
public PayManager(PayHelper payHelper, ILogger<PayManager> logger, AbstractNotify notify)
{
_payHelper = payHelper;
_logger = logger;

View File

@@ -40,8 +40,8 @@ namespace Yi.Framework.WeChatPay.Extensions
throw new PayException("NotifyUrl为空值");
}
services.AddSingleton(option);
services.AddTransient<PayInvoker>();
services.AddTransient<IPayInvoker, PayInvoker>();
services.AddTransient<PayManager>();
services.AddTransient<IPayManager, PayManager>();
services.AddTransient<IPayConfig, PayConfig>();
services.AddTransient<PayHelper>();
services.AddTransient<PayApi>();

View File

@@ -1,12 +1,17 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using StartupModules;
using Yi.Framework.Core;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Core.Configuration;
using Yi.Framework.WeChatPay.Extensions;
using Yi.Framework.WeChatPay.Options;
namespace Yi.Framework.WeChatPay
{
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkWeChatPayModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -6,9 +6,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Domain.Shared;
namespace Yi.Framework.Application.Contracts
{
[DependsOn(
typeof(YiFrameworkDomainSharedModule)
)]
public class YiFrameworkApplicationContractsModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -6,11 +6,18 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Application.Contracts;
using Yi.Framework.Application.Contracts.Student;
using Yi.Framework.Application.Student;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Domain;
namespace Yi.Framework.Application
{
[DependsOn(
typeof(YiFrameworkApplicationContractsModule),
typeof(YiFrameworkDomainModule)
)]
public class YiFrameworkApplicationModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -6,10 +6,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Ddd;
namespace Yi.Framework.Domain.Shared
{
public class YiFrameworkDomainSharedModule : IStartupModule
[DependsOn(
typeof(YiFrameworkDddModule)
)]
public class YiFrameworkDomainSharedModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)
{

View File

@@ -6,10 +6,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Domain.Shared;
using Yi.Framework.Domain.Student;
namespace Yi.Framework.Domain
{
[DependsOn(
typeof(YiFrameworkDomainSharedModule)
)]
public class YiFrameworkDomainModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -6,11 +6,16 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Core.Sqlsugar;
using Yi.Framework.Domain;
using Yi.Framework.Domain.Student.IRepository;
using Yi.Framework.Sqlsugar.Student;
namespace Yi.Framework.Sqlsugar
{
[DependsOn(typeof(YiFrameworkCoreSqlsugarModule),
typeof(YiFrameworkDomainModule))]
public class YiFrameworkSqlsugarModule : IStartupModule
{
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)

View File

@@ -1,15 +1,6 @@
using Yi.Framework.Application;
using Yi.Framework.Application.Contracts;
using Yi.Framework.Core;
using Yi.Framework.Core.Autofac.Extensions;
using Yi.Framework.Core.Autofac.Modules;
using Yi.Framework.Core.AutoMapper;
using Yi.Framework.Core.Extensions;
using Yi.Framework.Core.Sqlsugar;
using Yi.Framework.Ddd;
using Yi.Framework.Domain;
using Yi.Framework.Domain.Shared;
using Yi.Framework.Sqlsugar;
using Yi.Framework.Web;
TimeTest.Start();
@@ -18,21 +9,7 @@ var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls(builder.Configuration.GetValue<string>("StartUrl"));
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
builder.UseYiModules(
typeof(YiFrameworkCoreModule).Assembly,
typeof(YiFrameworkCoreAutoMapperModule).Assembly,
typeof(YiFrameworkDddModule).Assembly,
typeof(YiFrameworkCoreSqlsugarModule).Assembly,
typeof(YiFrameworkSqlsugarModule).Assembly,
typeof(YiFrameworkDomainSharedModule).Assembly,
typeof(YiFrameworkDomainModule).Assembly,
typeof(YiFrameworkApplicationContractsModule).Assembly,
typeof(YiFrameworkApplicationModule).Assembly,
typeof(YiFrameworkWebModule).Assembly
);
builder.UseYiModules(typeof(YiFrameworkWebModule));
//<2F><><EFBFBD><EFBFBD>autofacģ<63><C4A3>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
builder.Host.ConfigureAutoFacContainer(container =>
@@ -46,9 +23,4 @@ var app = builder.Build();
var t = app.Services.GetService<Test2Entity>();
app.MapControllers();
app.Run();

View File

@@ -7,3 +7,7 @@
2023:01:16-22:42:05本次运行启动时间为2008毫秒
2023:01:16-22:43:22本次运行启动时间为1910毫秒
2023:01:16-22:44:33本次运行启动时间为2017毫秒
2023:01:17-17:30:46本次运行启动时间为23171毫秒
2023:01:17-17:45:11本次运行启动时间为4771毫秒
2023:01:17-17:45:54本次运行启动时间为1917毫秒
2023:01:17-17:48:04本次运行启动时间为2138毫秒

View File

@@ -1,12 +1,20 @@
using AspNetCore.Microsoft.AspNetCore.Builder;
using StartupModules;
using Yi.Framework.Application;
using Yi.Framework.Core;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Sqlsugar;
namespace Yi.Framework.Web
{
/// <summary>
/// 这里是最后执行的模块
/// </summary>
[DependsOn(
typeof(YiFrameworkCoreModule),
typeof(YiFrameworkSqlsugarModule),
typeof(YiFrameworkApplicationModule)
)]
public class YiFrameworkWebModule : IStartupModule
{
public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context)