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 Microsoft.Extensions.DependencyInjection;
using StartupModules; using StartupModules;
using Yi.Framework.Autofac.Extensions; using Yi.Framework.Autofac.Extensions;
using Yi.Framework.Core.Attributes;
namespace Yi.Framework.Core.AutoMapper namespace Yi.Framework.Core.AutoMapper
{ {
[DependsOn(
typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkCoreAutoMapperModule : IStartupModule public class YiFrameworkCoreAutoMapperModule : IStartupModule
{ {
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)
{ {
} }

View File

@@ -23,6 +23,7 @@ namespace Yi.Framework.Core.Autofac.Extensions
switch (autoFacModuleEnum) switch (autoFacModuleEnum)
{ {
case AutoFacModuleEnum.PropertiesAutowiredModule: case AutoFacModuleEnum.PropertiesAutowiredModule:
Console.WriteLine($"意框架添加AutoFac模块{nameof(PropertiesAutowiredModule)}-属性注入模块");
new PropertiesAutowiredModule().Load(builder, assemblies); new PropertiesAutowiredModule().Load(builder, assemblies);
break; 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.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Yi.Framework.Core.Module;
namespace Yi.Framework.Core.Extensions namespace Yi.Framework.Core.Extensions
{ {
@@ -19,172 +20,17 @@ namespace Yi.Framework.Core.Extensions
/// </summary> /// </summary>
public static class ModuleExtensions public static class ModuleExtensions
{ {
// public static WebApplicationBuilder UseYiModules(this WebApplicationBuilder builder, Type startType)
// 摘要:
// 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)
{ {
return builder.UseStartupModules(delegate (StartupModulesOptions options) var moduleManager = new ModuleManager(startType);
{ moduleManager.Invoker();
options.DiscoverStartupModules();
}); Assembly[] assemblies2 = moduleManager.ToAssemblyArray();
}
//
// 摘要:
// 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;
return builder.UseStartupModules(delegate (StartupModulesOptions options) return builder.UseStartupModules(delegate (StartupModulesOptions options)
{ {
options.DiscoverStartupModules(assemblies2); 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> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Remove="Module\**" />
<EmbeddedResource Remove="Module\**" />
<None Remove="Module\**" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Options\" /> <Folder Include="Options\" />
</ItemGroup> </ItemGroup>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,11 +6,16 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; 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.Domain.Student.IRepository;
using Yi.Framework.Sqlsugar.Student; using Yi.Framework.Sqlsugar.Student;
namespace Yi.Framework.Sqlsugar namespace Yi.Framework.Sqlsugar
{ {
[DependsOn(typeof(YiFrameworkCoreSqlsugarModule),
typeof(YiFrameworkDomainModule))]
public class YiFrameworkSqlsugarModule : IStartupModule public class YiFrameworkSqlsugarModule : IStartupModule
{ {
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) 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.Extensions;
using Yi.Framework.Core.Autofac.Modules; using Yi.Framework.Core.Autofac.Modules;
using Yi.Framework.Core.AutoMapper;
using Yi.Framework.Core.Extensions; 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; using Yi.Framework.Web;
TimeTest.Start(); TimeTest.Start();
@@ -18,21 +9,7 @@ var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls(builder.Configuration.GetValue<string>("StartUrl")); builder.WebHost.UseUrls(builder.Configuration.GetValue<string>("StartUrl"));
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
builder.UseYiModules( builder.UseYiModules(typeof(YiFrameworkWebModule));
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
);
//<2F><><EFBFBD><EFBFBD>autofacģ<63><C4A3>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> //<2F><><EFBFBD><EFBFBD>autofacģ<63><C4A3>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
builder.Host.ConfigureAutoFacContainer(container => builder.Host.ConfigureAutoFacContainer(container =>
@@ -46,9 +23,4 @@ var app = builder.Build();
var t = app.Services.GetService<Test2Entity>(); var t = app.Services.GetService<Test2Entity>();
app.MapControllers(); app.MapControllers();
app.Run(); app.Run();

View File

@@ -7,3 +7,7 @@
2023:01:16-22:42:05本次运行启动时间为2008毫秒 2023:01:16-22:42:05本次运行启动时间为2008毫秒
2023:01:16-22:43:22本次运行启动时间为1910毫秒 2023:01:16-22:43:22本次运行启动时间为1910毫秒
2023:01:16-22:44:33本次运行启动时间为2017毫秒 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 AspNetCore.Microsoft.AspNetCore.Builder;
using StartupModules; using StartupModules;
using Yi.Framework.Application; using Yi.Framework.Application;
using Yi.Framework.Core;
using Yi.Framework.Core.Attributes;
using Yi.Framework.Sqlsugar;
namespace Yi.Framework.Web namespace Yi.Framework.Web
{ {
/// <summary> /// <summary>
/// 这里是最后执行的模块 /// 这里是最后执行的模块
/// </summary> /// </summary>
[DependsOn(
typeof(YiFrameworkCoreModule),
typeof(YiFrameworkSqlsugarModule),
typeof(YiFrameworkApplicationModule)
)]
public class YiFrameworkWebModule : IStartupModule public class YiFrameworkWebModule : IStartupModule
{ {
public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context)