From 92d245a1acc4310bf79186080333c80a6afc37ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Thu, 8 Oct 2020 01:11:10 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A5=B3=20Adjust=20project=20structure.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/Fur.Web.Core/Fur.Web.Core.csproj | 2 + framework/Fur.Web.Core/FurWebCoreStartup.cs | 27 ++++++++++++ framework/Fur.Web.Entry/Fur.Web.Entry.csproj | 2 - framework/Fur.Web.Entry/Startup.cs | 29 ------------- framework/Fur.Web.Entry/wwwroot/README.md | 2 +- framework/Fur/App/App.cs | 8 ++++ .../AppServiceCollectionExtensions.cs | 4 +- .../{ => Types}/ObjectExtensions.cs | 0 framework/Fur/App/Filters/StartupFilter.cs | 41 +++++++++++++++++-- handbook/docs/get-start.mdx | 22 ++-------- 10 files changed, 83 insertions(+), 54 deletions(-) rename framework/Fur/App/Extensions/{ => Types}/ObjectExtensions.cs (100%) diff --git a/framework/Fur.Web.Core/Fur.Web.Core.csproj b/framework/Fur.Web.Core/Fur.Web.Core.csproj index dc2a097706d..c6fd0a56e71 100644 --- a/framework/Fur.Web.Core/Fur.Web.Core.csproj +++ b/framework/Fur.Web.Core/Fur.Web.Core.csproj @@ -11,6 +11,8 @@ + + diff --git a/framework/Fur.Web.Core/FurWebCoreStartup.cs b/framework/Fur.Web.Core/FurWebCoreStartup.cs index 1d8bd5b68ff..f0b2525f23e 100644 --- a/framework/Fur.Web.Core/FurWebCoreStartup.cs +++ b/framework/Fur.Web.Core/FurWebCoreStartup.cs @@ -1,5 +1,8 @@ using Fur.UnifyResult; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; namespace Fur.Web.Core { @@ -17,5 +20,29 @@ public void ConfigureServices(IServiceCollection services) .AddFriendlyException() .AddUnifyResult(); } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseCorsAccessor(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseSpecificationDocuments(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } } } \ No newline at end of file diff --git a/framework/Fur.Web.Entry/Fur.Web.Entry.csproj b/framework/Fur.Web.Entry/Fur.Web.Entry.csproj index cd8f861e05b..8c0e420441c 100644 --- a/framework/Fur.Web.Entry/Fur.Web.Entry.csproj +++ b/framework/Fur.Web.Entry/Fur.Web.Entry.csproj @@ -19,8 +19,6 @@ - - diff --git a/framework/Fur.Web.Entry/Startup.cs b/framework/Fur.Web.Entry/Startup.cs index e8849449586..f5665681d51 100644 --- a/framework/Fur.Web.Entry/Startup.cs +++ b/framework/Fur.Web.Entry/Startup.cs @@ -1,46 +1,17 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; namespace Fur.Web.Entry { public class Startup { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - public void ConfigureServices(IServiceCollection services) { } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseHttpsRedirection(); - - app.UseRouting(); - - app.UseCorsAccessor(); - - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseSpecificationDocuments(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); } } } \ No newline at end of file diff --git a/framework/Fur.Web.Entry/wwwroot/README.md b/framework/Fur.Web.Entry/wwwroot/README.md index 77031ec17d3..8cb9887fb93 100644 --- a/framework/Fur.Web.Entry/wwwroot/README.md +++ b/framework/Fur.Web.Entry/wwwroot/README.md @@ -1 +1 @@ -`Fur` 是 `.NET 5` 平台下极易入门、极速开发的 Web 应用框架。 \ No newline at end of file +`Fur` 是 `.NET 5` 平台下极易入门、极速开发的 `Web` 应用框架。 \ No newline at end of file diff --git a/framework/Fur/App/App.cs b/framework/Fur/App/App.cs index 4d19a70d60b..4b519727348 100644 --- a/framework/Fur/App/App.cs +++ b/framework/Fur/App/App.cs @@ -24,6 +24,7 @@ using Microsoft.Extensions.Options; using StackExchange.Profiling; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -99,6 +100,11 @@ public static AppSettingsOptions Settings /// internal static IServiceCollection InternalServices; + /// + /// 应用所有启动配置对象 + /// + internal static ConcurrentBag Startups; + /// /// 构造函数 /// @@ -107,6 +113,8 @@ static App() Assemblies = GetAssemblies(); CanBeScanTypes = Assemblies.SelectMany(u => u.GetTypes() .Where(u => u.IsPublic && !u.IsDefined(typeof(SkipScanAttribute), false))); + + Startups = new ConcurrentBag(); } /// diff --git a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs index d7e709edb7e..fe4bf6fc55c 100644 --- a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs +++ b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs @@ -87,6 +87,9 @@ internal static IServiceCollection AddStartup(this IServiceCollection services, // 注册自定义 starup foreach (var type in startups) { + var startup = Activator.CreateInstance(type) as AppStartup; + App.Startups.Add(startup); + // 获取所有符合依赖注入格式的方法,如返回值void,且第一个参数是 IServiceCollection 类型 var serviceMethods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance) .Where(u => u.ReturnType == typeof(void) @@ -95,7 +98,6 @@ internal static IServiceCollection AddStartup(this IServiceCollection services, if (!serviceMethods.Any()) continue; - var startup = Activator.CreateInstance(type) as AppStartup; // 自动安装属性调用 foreach (var method in serviceMethods) { diff --git a/framework/Fur/App/Extensions/ObjectExtensions.cs b/framework/Fur/App/Extensions/Types/ObjectExtensions.cs similarity index 100% rename from framework/Fur/App/Extensions/ObjectExtensions.cs rename to framework/Fur/App/Extensions/Types/ObjectExtensions.cs diff --git a/framework/Fur/App/Filters/StartupFilter.cs b/framework/Fur/App/Filters/StartupFilter.cs index d5990d72265..394ce1b50da 100644 --- a/framework/Fur/App/Filters/StartupFilter.cs +++ b/framework/Fur/App/Filters/StartupFilter.cs @@ -14,7 +14,10 @@ using Fur.DependencyInjection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; using System; +using System.Linq; +using System.Reflection; namespace Fur { @@ -56,13 +59,45 @@ public Action Configure(Action next) // 调用默认中间件 app.UseApp(); - // 获取环境和配置 - //var env = applicationServices.GetRequiredService(); - //var config = applicationServices.GetRequiredService(); + UseStartup(app, applicationServices); // 调用 Fur.Web.Entry 中的 Startup next(app); }; } + + /// + /// 配置 Startup 的 Configure + /// + /// 应用构建器 + /// 服务提供器 + private static void UseStartup(IApplicationBuilder app, IServiceProvider applicationServices) + { + var startups = App.Startups; + if (!startups.Any()) return; + + // 获取环境和配置 + var env = applicationServices.GetRequiredService(); + + foreach (var startup in startups) + { + var type = startup.GetType(); + + // 获取所有符合依赖注入格式的方法,如返回值void,且第一个参数是 IApplicationBuilder 类型,第二个参数是 IWebHostEnvironment + var configureMethods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Where(u => u.ReturnType == typeof(void) + && u.GetParameters().Length > 1 + && u.GetParameters()[0].ParameterType == typeof(IApplicationBuilder) + && u.GetParameters()[1].ParameterType == typeof(IWebHostEnvironment)); + + if (!configureMethods.Any()) continue; + + // 自动安装属性调用 + foreach (var method in configureMethods) + { + method.Invoke(startup, new object[] { app, env }); + } + } + } } } \ No newline at end of file diff --git a/handbook/docs/get-start.mdx b/handbook/docs/get-start.mdx index 951a2eded87..ad1b31a1f20 100644 --- a/handbook/docs/get-start.mdx +++ b/handbook/docs/get-start.mdx @@ -95,7 +95,7 @@ using Microsoft.EntityFrameworkCore; namespace Fur.EntityFramework.Core { - [AppDbContext("DbConnectionString")] // 配置连接字符串 + [AppDbContext("Data Source=./Fur.db")] // 配置连接字符串 public class FurDbContext : AppDbContext // 继承 AppDbContext<> 类 { /// @@ -109,24 +109,11 @@ namespace Fur.EntityFramework.Core } ``` -### 2.2.3 配置数据库连接字符串 - -在 `Fur.EntityFramework.Core` 的 `dbsettings.json` 中配置数据库连接字符串,代码如下: - -```json {2-4} title="Fur\framework\Fur.EntityFramework.Core\dbsettings.json" -{ - "ConnectionStrings": { - "DbConnectionString": "Server=localhost;Database=Fur;User=sa;Password=000000;MultipleActiveResultSets=True;", - "Sqlite3ConnectionString": "Data Source=./Fur.db" - } -} -``` - -### 2.2.4 配置数据库上下文 +### 2.2.3 配置数据库上下文 在 `Fur.EntityFramework.Core` 的 `FurEntityFrameworkCoreStartup` 中配置数据库上下文,代码如下: -```cs {12-14} title="Fur\framework\Fur.EntityFramework.Core\FurEntityFrameworkCoreStartup.cs" +```cs {11-14} title="Fur\framework\Fur.EntityFramework.Core\FurEntityFrameworkCoreStartup.cs" using Fur.DatabaseAccessor; using Microsoft.Extensions.DependencyInjection; @@ -137,7 +124,6 @@ namespace Fur.EntityFramework.Core { public void ConfigureServices(IServiceCollection services) { - // 配置数据库上下文,支持N个数据库 services.AddDatabaseAccessor(options => { options.AddDbPool(DbProvider.Sqlite); @@ -155,7 +141,7 @@ namespace Fur.EntityFramework.Core ::: -### 2.2.5 通过命令创建数据库表 +### 2.2.4 通过命令创建数据库表 打开 `程序包管理控制台`,如下图所示: