From 426a0b7a764d638d94e7ee457aefbc6d008c86ca Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 11:59:56 +0800 Subject: [PATCH 01/20] =?UTF-8?q?=E4=B8=8D=E4=BE=9D=E8=B5=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BA=93=EF=BC=8C=E9=80=9A=E8=BF=87=E4=B8=8A=E5=B1=82?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=BF=9B=E8=A1=8C=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dotnetCampus.ApplicationStartupManager.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj index 6ef8f4e..631975f 100644 --- a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj +++ b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj @@ -41,7 +41,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From ccee508e75e972683a7a833c41d92a1827af1a6a Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 12:08:10 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E5=85=A8=E9=9D=A2=E5=B9=B2=E6=8E=89?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IStartupContext.cs | 6 ++--- .../StartupContext.cs | 22 +++++++++---------- .../StartupManager.cs | 14 ++++++------ 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/IStartupContext.cs b/src/dotnetCampus.ApplicationStartupManager/IStartupContext.cs index 7108c43..0f628dc 100644 --- a/src/dotnetCampus.ApplicationStartupManager/IStartupContext.cs +++ b/src/dotnetCampus.ApplicationStartupManager/IStartupContext.cs @@ -1,12 +1,12 @@ using System.Threading.Tasks; -using dotnetCampus.Configurations; +//using dotnetCampus.Configurations; namespace dotnetCampus.ApplicationStartupManager { public interface IStartupContext { - IAppConfigurator Configs { get; } - Task ReadCacheAsync(string key, string @default = ""); + //IAppConfigurator Configs { get; } + //Task ReadCacheAsync(string key, string @default = ""); Task WaitStartupTaskAsync(string startupKey); } } \ No newline at end of file diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs b/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs index ca3dc8b..4868fae 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs @@ -1,7 +1,7 @@ using System; using System.Threading.Tasks; -using dotnetCampus.Configurations; -using dotnetCampus.Configurations.Core; +//using dotnetCampus.Configurations; +//using dotnetCampus.Configurations.Core; namespace dotnetCampus.ApplicationStartupManager { @@ -9,28 +9,28 @@ namespace dotnetCampus.ApplicationStartupManager { public IStartupLogger Logger { get; } - public FileConfigurationRepo Configuration { get; } + //public FileConfigurationRepo Configuration { get; } - public IAppConfigurator Configs { get; } + //public IAppConfigurator Configs { get; } public Func FastFail { get; } private readonly Func _waitStartupTaskAsync; - public Task ReadCacheAsync(string key, string @default = "") - { - return Configuration.TryReadAsync(key, @default); - } + //public Task ReadCacheAsync(string key, string @default = "") + //{ + // return Configuration.TryReadAsync(key, @default); + //} Task IStartupContext.WaitStartupTaskAsync(string startupKey) => _waitStartupTaskAsync(startupKey); - public StartupContext(IStartupLogger logger, FileConfigurationRepo configuration, + public StartupContext(IStartupLogger logger, /*FileConfigurationRepo configuration,*/ Func fastFailAction, Func waitStartupAsync) { Logger = logger; - Configuration = configuration; + //Configuration = configuration; _waitStartupTaskAsync = waitStartupAsync; - Configs = configuration.CreateAppConfigurator(); + //Configs = configuration.CreateAppConfigurator(); FastFail = fastFailAction ?? (exception => StartupTask.CompletedTask); } } diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index a707fbe..1cea353 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -8,7 +8,7 @@ using System.Net.Mime; using System.Reflection; using System.Threading; using System.Threading.Tasks; -using dotnetCampus.Configurations.Core; +//using dotnetCampus.Configurations.Core; namespace dotnetCampus.ApplicationStartupManager { @@ -48,7 +48,7 @@ namespace dotnetCampus.ApplicationStartupManager private IStartupLogger Logger => Context.Logger; - public StartupManager(IStartupLogger logger, FileConfigurationRepo configurationRepo, + public StartupManager(IStartupLogger logger, /*FileConfigurationRepo configurationRepo,*/ Func fastFailAction, IMainThreadDispatcher dispatcher, bool shouldSetThreadPool = true) { if (logger == null) @@ -56,10 +56,10 @@ namespace dotnetCampus.ApplicationStartupManager throw new ArgumentNullException(nameof(logger)); } - if (configurationRepo is null) - { - throw new ArgumentNullException(nameof(configurationRepo)); - } + //if (configurationRepo is null) + //{ + // throw new ArgumentNullException(nameof(configurationRepo)); + //} _dispatcher = dispatcher; @@ -71,7 +71,7 @@ namespace dotnetCampus.ApplicationStartupManager ThreadPool.SetMinThreads(Math.Max(_workerThreads, 16), Math.Max(_completionPortThreads, 16)); } - Context = new StartupContext(logger, configurationRepo, + Context = new StartupContext(logger, /*configurationRepo,*/ fastFailAction, WaitStartupTaskAsync); Logger.RecordTime("ManagerInitialized"); From 27405f7da3490b980d1ed5a312be395249fc395b Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:21:11 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManager.cs | 89 +++++++++++-------- ...netCampus.ApplicationStartupManager.csproj | 2 +- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index 1cea353..c42f4d5 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -16,10 +16,10 @@ namespace dotnetCampus.ApplicationStartupManager { private readonly IMainThreadDispatcher _dispatcher; - /// - /// Builder 模式所需状态:包含当前剩余需要管理的启动任务程序集。 - /// - private readonly List _assembliesToBeManaged = new List(); + ///// + ///// Builder 模式所需状态:包含当前剩余需要管理的启动任务程序集。 + ///// + //private readonly List _assembliesToBeManaged = new List(); /// /// Builder 模式所需状态:包含当前所有的关键启动任务。 @@ -77,21 +77,38 @@ namespace dotnetCampus.ApplicationStartupManager Logger.RecordTime("ManagerInitialized"); } + ///// + ///// 配置被 管理的程序集。 + ///// 只有被管理的程序集中的启动信息、依赖注入信息才会被执行。 + ///// + ///// + ///// + //public StartupManager ConfigAssemblies(IEnumerable assemblies) + //{ + // // 可能的限制尚未完成: + // // 1. Run 之后不能再调用此方法(适用于固定的程序集应用); + // // 2. 可以多次 Config 然后多次 Run(适用于动态加载的插件程序集)。 + // _assembliesToBeManaged.AddRange(assemblies); + // return this; + //} + /// /// 配置被 管理的程序集。 /// 只有被管理的程序集中的启动信息、依赖注入信息才会被执行。 /// - /// + /// /// - public StartupManager ConfigAssemblies(IEnumerable assemblies) + public StartupManager AddStartupTaskMetadataCollector(Func> collector) { // 可能的限制尚未完成: // 1. Run 之后不能再调用此方法(适用于固定的程序集应用); // 2. 可以多次 Config 然后多次 Run(适用于动态加载的插件程序集)。 - _assembliesToBeManaged.AddRange(assemblies); + _startupTaskMetadataCollectorList.Add(collector); return this; } + private readonly ConcurrentBag>> _startupTaskMetadataCollectorList = new ConcurrentBag>>(); + /// /// 在启动流程中定义一组关键的启动节点。使用此方法定义的关键启动节点将按顺序前后依次依赖。 /// 例如传入 A、B、C、D 四个关键启动节点,那么 A - B - C - D 将依次执行,其他任务将插入其中。 @@ -192,24 +209,25 @@ namespace dotnetCampus.ApplicationStartupManager return this; } - public StartupManager SelectNodes(StartupCategory categories) - { - _selectingCategories = categories; - return this; - } + // 不支持被使用 + //public StartupManager SelectNodes(StartupCategory categories) + //{ + // _selectingCategories = categories; + // return this; + //} - public StartupManager ForStartupTasksOfCategory(StartupCategory category, - Action taskBuilder) - { - _additionalBuilders.Add(builder => - { - if (builder.Categories == category) - { - taskBuilder(builder); - } - }); - return this; - } + //public StartupManager ForStartupTasksOfCategory(StartupCategory category, + // Action taskBuilder) + //{ + // _additionalBuilders.Add(builder => + // { + // if (builder.Categories == category) + // { + // taskBuilder(builder); + // } + // }); + // return this; + //} public async void Run() { @@ -254,7 +272,7 @@ namespace dotnetCampus.ApplicationStartupManager wrapper.Categories &= _selectingCategories; } - var taskMetadataList = ExportStartupTasks(_assembliesToBeManaged, _selectingCategories).ToList(); + var taskMetadataList = ExportStartupTasks().ToList(); foreach (var meta in taskMetadataList) { @@ -294,20 +312,15 @@ namespace dotnetCampus.ApplicationStartupManager return DFSGraph(wrappers); - IEnumerable ExportStartupTasks( - IEnumerable assemblies, StartupCategory categories) + IEnumerable ExportStartupTasks() { - // todo 高性能的预编译框架接入 - //foreach (var meta in AssemblyMetadataExporter.ExportStartupTasks(assemblies)) - //{ - // meta.Categories &= categories; - // if (meta.Categories != StartupCategory.None) - // { - // yield return meta; - // } - //} - - yield break; + foreach (var func in _startupTaskMetadataCollectorList) + { + foreach (var taskMetadata in func()) + { + yield return taskMetadata; + } + } } void AddDependencies(StartupTaskWrapper wrapper, string afterTasks) diff --git a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj index 631975f..b9d1775 100644 --- a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj +++ b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj @@ -4,7 +4,7 @@ netcoreapp3.1;netstandard2.0;net45;net5.0 true - true + From d0955b44120b4e01d705c7c1fddb9a71d53e2b84 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:22:20 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B=E8=A2=AB=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 因为有很多业务需要重写处理逻辑 --- .../StartupManager.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index c42f4d5..46edebc 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -312,17 +312,6 @@ namespace dotnetCampus.ApplicationStartupManager return DFSGraph(wrappers); - IEnumerable ExportStartupTasks() - { - foreach (var func in _startupTaskMetadataCollectorList) - { - foreach (var taskMetadata in func()) - { - yield return taskMetadata; - } - } - } - void AddDependencies(StartupTaskWrapper wrapper, string afterTasks) { foreach (var task in afterTasks.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries) @@ -364,6 +353,18 @@ namespace dotnetCampus.ApplicationStartupManager } } + protected virtual IEnumerable ExportStartupTasks() + { + foreach (var func in _startupTaskMetadataCollectorList) + { + var taskMetadataList = func(); + foreach (var taskMetadata in taskMetadataList) + { + yield return taskMetadata; + } + } + } + private static string CompatibleTaskName(string task) { const string startupName = "Startup"; From 360190e936ead4b2e850c1ffd27bc8d0d2b43b1a Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:23:06 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=87=8D=E5=86=99?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=85=B6=E4=BB=96=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dotnetCampus.ApplicationStartupManager/StartupManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index 46edebc..85b3ff1 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -98,7 +98,7 @@ namespace dotnetCampus.ApplicationStartupManager /// /// /// - public StartupManager AddStartupTaskMetadataCollector(Func> collector) + public virtual StartupManager AddStartupTaskMetadataCollector(Func> collector) { // 可能的限制尚未完成: // 1. Run 之后不能再调用此方法(适用于固定的程序集应用); From 4c05583398f2d9912149c2a01669bc58f8d392b3 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:25:05 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E9=A2=84=E8=AE=A1=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E9=9C=80=E8=A6=81=E6=9C=89=E9=87=8D=E5=86=99=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=9B=A0=E6=AD=A4=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IStartupManager.cs | 2 +- .../NullObjectStartup.cs | 2 +- .../StartupContext.cs | 2 +- .../StartupManager.cs | 18 +++++++++--------- .../{StartupTask.cs => StartupTaskBase.cs} | 4 ++-- .../StartupTaskMetadata.T.cs | 2 +- .../StartupTaskMetadata.cs | 18 +++++++++--------- .../StartupTaskWrapper.cs | 6 +++--- 8 files changed, 27 insertions(+), 27 deletions(-) rename src/dotnetCampus.ApplicationStartupManager/{StartupTask.cs => StartupTaskBase.cs} (95%) diff --git a/src/dotnetCampus.ApplicationStartupManager/IStartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/IStartupManager.cs index 526e95a..01470be 100644 --- a/src/dotnetCampus.ApplicationStartupManager/IStartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/IStartupManager.cs @@ -6,6 +6,6 @@ namespace dotnetCampus.ApplicationStartupManager { Task WaitStartupTaskAsync(string startupTaskKey); - StartupTask GetStartupTask() where T : StartupTask; + StartupTaskBase GetStartupTask() where T : StartupTaskBase; } } \ No newline at end of file diff --git a/src/dotnetCampus.ApplicationStartupManager/NullObjectStartup.cs b/src/dotnetCampus.ApplicationStartupManager/NullObjectStartup.cs index 44ca647..5f1edc8 100644 --- a/src/dotnetCampus.ApplicationStartupManager/NullObjectStartup.cs +++ b/src/dotnetCampus.ApplicationStartupManager/NullObjectStartup.cs @@ -1,6 +1,6 @@ namespace dotnetCampus.ApplicationStartupManager { - internal sealed class NullObjectStartup : StartupTask + internal sealed class NullObjectStartup : StartupTaskBase { } diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs b/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs index 4868fae..8b7a18a 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupContext.cs @@ -31,7 +31,7 @@ namespace dotnetCampus.ApplicationStartupManager //Configuration = configuration; _waitStartupTaskAsync = waitStartupAsync; //Configs = configuration.CreateAppConfigurator(); - FastFail = fastFailAction ?? (exception => StartupTask.CompletedTask); + FastFail = fastFailAction ?? (exception => StartupTaskBase.CompletedTask); } } } \ No newline at end of file diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index 85b3ff1..73b0ec1 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -146,7 +146,7 @@ namespace dotnetCampus.ApplicationStartupManager { var key = criticalNodeKeys[i]; var current = GetStartupTaskWrapper(key); - current.StartupTask = new NullObjectStartup(); + current.TaskBase = new NullObjectStartup(); current.Categories = StartupCategory.All; if (i - 1 >= 0) @@ -184,7 +184,7 @@ namespace dotnetCampus.ApplicationStartupManager public StartupManager AddCriticalNodes(string nodeName, string beforeTasks = null, string afterTasks = null) { var wrapper = GetStartupTaskWrapper(nodeName); - wrapper.StartupTask = new NullObjectStartup(); + wrapper.TaskBase = new NullObjectStartup(); wrapper.Categories = StartupCategory.All; if (beforeTasks?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries) is string[] before) @@ -240,7 +240,7 @@ namespace dotnetCampus.ApplicationStartupManager var dispatcher = _dispatcher; foreach (var wrapper in Graph) { - var startupTasks = wrapper.Dependencies.Select(s => GetStartupTaskWrapper(s).StartupTask); + var startupTasks = wrapper.Dependencies.Select(s => GetStartupTaskWrapper(s).TaskBase); if (wrapper.UIOnly) { await dispatcher.InvokeAsync(() => wrapper.ExecuteTask(startupTasks, Context)); @@ -251,7 +251,7 @@ namespace dotnetCampus.ApplicationStartupManager } } - await Graph.Last().StartupTask.TaskResult; + await Graph.Last().TaskBase.TaskResult; Logger.RecordTime("AllStartupTasksCompleted"); @@ -280,8 +280,8 @@ namespace dotnetCampus.ApplicationStartupManager wrapper.UIOnly = meta.Scheduler == StartupScheduler.UIOnly; wrapper.Categories = meta.Categories; wrapper.CriticalLevel = meta.CriticalLevel; - wrapper.StartupTask = meta.Instance; - wrapper.StartupTask.Manager = this; + wrapper.TaskBase = meta.Instance; + wrapper.TaskBase.Manager = this; wrappers.Add(wrapper); } @@ -446,10 +446,10 @@ namespace dotnetCampus.ApplicationStartupManager } public Task WaitStartupTaskAsync(string startupTaskKey) - => GetStartupTaskWrapper(startupTaskKey).StartupTask.TaskResult; + => GetStartupTaskWrapper(startupTaskKey).TaskBase.TaskResult; - StartupTask IStartupManager.GetStartupTask() - => GetStartupTaskWrapper(StartupTypeToKey(typeof(T))).StartupTask; + StartupTaskBase IStartupManager.GetStartupTask() + => GetStartupTaskWrapper(StartupTypeToKey(typeof(T))).TaskBase; private static string StartupTypeToKey(Type type) => type.Name.Remove(type.Name.Length - "startup".Length); diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTask.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs similarity index 95% rename from src/dotnetCampus.ApplicationStartupManager/StartupTask.cs rename to src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs index 5a81cd3..4fd4aea 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTask.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; namespace dotnetCampus.ApplicationStartupManager { - public abstract class StartupTask + public abstract class StartupTaskBase { // 由于我们都在编译期间收集 Attribute 了,当然也能收集使用方到底重写了哪个 Run。 // 这里传入的 isUIOnly 就是编译期间收集的那个属性。 @@ -49,7 +49,7 @@ namespace dotnetCampus.ApplicationStartupManager internal IStartupManager Manager { get; set; } - protected TValue FetchValue() where TStartup : StartupTask, IStartupValueProvider + protected TValue FetchValue() where TStartup : StartupTaskBase, IStartupValueProvider { var task = Manager.GetStartupTask(); var v = (IStartupValueProvider)task; diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.T.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.T.cs index d508d04..1c890b9 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.T.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.T.cs @@ -8,7 +8,7 @@ namespace dotnetCampus.ApplicationStartupManager /// 记录 类型中标记的从 中统一收集元数据。 /// /// - public class StartupTaskMetadata : StartupTaskMetadata where TStartupTask : StartupTask, new() + public class StartupTaskMetadata : StartupTaskMetadata where TStartupTask : StartupTaskBase, new() { /// /// 创建包含 元数据的 的新实例。 diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs index b0aa7c6..c71a36c 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs @@ -4,29 +4,29 @@ using System.Threading; namespace dotnetCampus.ApplicationStartupManager { /// - /// 记录 类型中标记的从 中统一收集元数据。 + /// 记录 类型中标记的从 中统一收集元数据。 /// public class StartupTaskMetadata { - private readonly Lazy _taskLazy; + private readonly Lazy _taskLazy; private string _afterTasks; private string _beforeTasks; /// /// 创建 的新实例。 /// - /// 表示此 的唯一标识符。 - /// 实例的创建方法。 - public StartupTaskMetadata( string key, Func creator) + /// 表示此 的唯一标识符。 + /// 实例的创建方法。 + public StartupTaskMetadata( string key, Func creator) { Key = key ?? throw new ArgumentNullException(nameof(key)); - _taskLazy = new Lazy( + _taskLazy = new Lazy( creator ?? throw new ArgumentNullException(nameof(creator)), LazyThreadSafetyMode.None); } /// - /// 获取 的唯一标识符。 + /// 获取 的唯一标识符。 /// public string Key { get; } @@ -59,9 +59,9 @@ namespace dotnetCampus.ApplicationStartupManager public StartupScheduler Scheduler { get; set; } /// - /// 根据从元数据中收集到的创建 的方法获取或创建 的实例。 + /// 根据从元数据中收集到的创建 的方法获取或创建 的实例。 /// - public StartupTask Instance => _taskLazy.Value; + public StartupTaskBase Instance => _taskLazy.Value; /// /// 获取 的值,如果没有获取或设置此启动任务的关键级别,则为 。 diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs index 86f73d8..31c2693 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs @@ -20,7 +20,7 @@ namespace dotnetCampus.ApplicationStartupManager public StartupCategory Categories { get; internal set; } = StartupCategory.All; - public StartupTask StartupTask { get; internal set; } + public StartupTaskBase TaskBase { get; internal set; } public bool UIOnly { get; internal set; } public StartupCriticalLevel CriticalLevel { get; set; } @@ -29,7 +29,7 @@ namespace dotnetCampus.ApplicationStartupManager StartupTaskKey = startupTaskKey; } - public async void ExecuteTask(IEnumerable dependencies, StartupContext context) + public async void ExecuteTask(IEnumerable dependencies, StartupContext context) { await Task.WhenAll(dependencies.Select(task => task.TaskResult)); #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 @@ -43,7 +43,7 @@ namespace dotnetCampus.ApplicationStartupManager //todo Tracer.Info($"[Startup]关键节点:{StartupTaskKey}开始执行"); } - var result = await StartupTask.JoinAsync(context, UIOnly); + var result = await TaskBase.JoinAsync(context, UIOnly); if (CriticalLevel == StartupCriticalLevel.Critical) { From c553eba976b3a10b20048b62d14280f4dbe4e188 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:36:53 +0800 Subject: [PATCH 07/20] =?UTF-8?q?=E8=AE=A9=E5=90=AF=E5=8A=A8=E9=A1=B9?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=BF=9B=E8=A1=8C=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 可以让业务进行重写逻辑 --- .../StartupManager.cs | 8 +++++++- .../StartupTaskWrapper.cs | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index 73b0ec1..0abb32d 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -431,7 +431,7 @@ namespace dotnetCampus.ApplicationStartupManager return wrapper; } - wrapper = new StartupTaskWrapper(startupTaskKey); + wrapper = new StartupTaskWrapper(startupTaskKey, this); if (StartupTaskWrappers.TryAdd(startupTaskKey, wrapper)) { return wrapper; @@ -453,5 +453,11 @@ namespace dotnetCampus.ApplicationStartupManager private static string StartupTypeToKey(Type type) => type.Name.Remove(type.Name.Length - "startup".Length); + + protected virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask, IStartupContext context, + bool uiOnly) + { + return startupTask.JoinAsync(context, uiOnly); + } } } \ No newline at end of file diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs index 31c2693..0814dda 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs @@ -9,6 +9,7 @@ namespace dotnetCampus.ApplicationStartupManager [DebuggerDisplay("{StartupTaskKey}:{IsVisited},{VisitedFinishTime}")] internal class StartupTaskWrapper : IStartupTaskWrapper { + private readonly StartupManager _manager; public HashSet FollowTasks { get; private set; } = new HashSet(); public HashSet Dependencies { get; private set; } = new HashSet(); @@ -24,8 +25,9 @@ namespace dotnetCampus.ApplicationStartupManager public bool UIOnly { get; internal set; } public StartupCriticalLevel CriticalLevel { get; set; } - public StartupTaskWrapper(string startupTaskKey) + public StartupTaskWrapper(string startupTaskKey, StartupManager manager) { + _manager = manager; StartupTaskKey = startupTaskKey; } @@ -43,7 +45,7 @@ namespace dotnetCampus.ApplicationStartupManager //todo Tracer.Info($"[Startup]关键节点:{StartupTaskKey}开始执行"); } - var result = await TaskBase.JoinAsync(context, UIOnly); + var result = await _manager.ExecuteStartupTaskAsync(TaskBase, context, UIOnly); if (CriticalLevel == StartupCriticalLevel.Critical) { From a9d80197a9ae0375cb97f8fbc78a62d5f8dc1e01 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:38:11 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dotnetCampus.ApplicationStartupManager/StartupManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs index 0abb32d..94bd42c 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs @@ -454,7 +454,7 @@ namespace dotnetCampus.ApplicationStartupManager private static string StartupTypeToKey(Type type) => type.Name.Remove(type.Name.Length - "startup".Length); - protected virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask, IStartupContext context, + internal virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask, IStartupContext context, bool uiOnly) { return startupTask.JoinAsync(context, uiOnly); From 17336e3d9f4d1a4f049031be14a5e4b3ac5ab249 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:41:15 +0800 Subject: [PATCH 09/20] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tartupManager.cs => StartupManagerBase.cs} | 22 +++++++++---------- .../StartupTaskWrapper.cs | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) rename src/dotnetCampus.ApplicationStartupManager/{StartupManager.cs => StartupManagerBase.cs} (94%) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs similarity index 94% rename from src/dotnetCampus.ApplicationStartupManager/StartupManager.cs rename to src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index 94bd42c..fe6b7e5 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManager.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace dotnetCampus.ApplicationStartupManager { - public class StartupManager : IStartupManager + public class StartupManagerBase : IStartupManager { private readonly IMainThreadDispatcher _dispatcher; @@ -48,7 +48,7 @@ namespace dotnetCampus.ApplicationStartupManager private IStartupLogger Logger => Context.Logger; - public StartupManager(IStartupLogger logger, /*FileConfigurationRepo configurationRepo,*/ + public StartupManagerBase(IStartupLogger logger, /*FileConfigurationRepo configurationRepo,*/ Func fastFailAction, IMainThreadDispatcher dispatcher, bool shouldSetThreadPool = true) { if (logger == null) @@ -83,7 +83,7 @@ namespace dotnetCampus.ApplicationStartupManager ///// ///// ///// - //public StartupManager ConfigAssemblies(IEnumerable assemblies) + //public StartupManagerBase ConfigAssemblies(IEnumerable assemblies) //{ // // 可能的限制尚未完成: // // 1. Run 之后不能再调用此方法(适用于固定的程序集应用); @@ -93,12 +93,12 @@ namespace dotnetCampus.ApplicationStartupManager //} /// - /// 配置被 管理的程序集。 + /// 配置被 管理的程序集。 /// 只有被管理的程序集中的启动信息、依赖注入信息才会被执行。 /// /// /// - public virtual StartupManager AddStartupTaskMetadataCollector(Func> collector) + public virtual StartupManagerBase AddStartupTaskMetadataCollector(Func> collector) { // 可能的限制尚未完成: // 1. Run 之后不能再调用此方法(适用于固定的程序集应用); @@ -114,14 +114,14 @@ namespace dotnetCampus.ApplicationStartupManager /// 例如传入 A、B、C、D 四个关键启动节点,那么 A - B - C - D 将依次执行,其他任务将插入其中。 /// /// 关键启动节点的名称。 - /// 实例自身,用于使用重建者模式创建启动流程管理器。 + /// 实例自身,用于使用重建者模式创建启动流程管理器。 /// /// /// 通常情况下你可以编写常规的 StartupTask 来添加一个关键节点,只要这个节点被众多节点声明了依赖,那么它就能视为一个关键节点。 /// 使用此方法可以添加一些虚拟的,实际上不会执行任何启动任务的关键启动节点,用于汇总其他模块的依赖关系。 /// /// - public StartupManager UseCriticalNodes(params string[] criticalNodeKeys) + public StartupManagerBase UseCriticalNodes(params string[] criticalNodeKeys) { if (criticalNodeKeys == null) { @@ -170,7 +170,7 @@ namespace dotnetCampus.ApplicationStartupManager /// 关键节点的名称。 /// 关键节点的前置节点。 /// 关键节点的后置节点。 - /// 实例自身,用于使用重建者模式创建启动流程管理器。 + /// 实例自身,用于使用重建者模式创建启动流程管理器。 /// /// /// 通常情况下你可以编写常规的 StartupTask 来添加一个关键节点,只要这个节点被众多节点声明了依赖,那么它就能视为一个关键节点。 @@ -181,7 +181,7 @@ namespace dotnetCampus.ApplicationStartupManager /// 例如,你需要根据不同的启动条件决定不同的启动顺序,那么你可能需要使用此方法动态生成关键节点。 /// /// - public StartupManager AddCriticalNodes(string nodeName, string beforeTasks = null, string afterTasks = null) + public StartupManagerBase AddCriticalNodes(string nodeName, string beforeTasks = null, string afterTasks = null) { var wrapper = GetStartupTaskWrapper(nodeName); wrapper.TaskBase = new NullObjectStartup(); @@ -210,13 +210,13 @@ namespace dotnetCampus.ApplicationStartupManager } // 不支持被使用 - //public StartupManager SelectNodes(StartupCategory categories) + //public StartupManagerBase SelectNodes(StartupCategory categories) //{ // _selectingCategories = categories; // return this; //} - //public StartupManager ForStartupTasksOfCategory(StartupCategory category, + //public StartupManagerBase ForStartupTasksOfCategory(StartupCategory category, // Action taskBuilder) //{ // _additionalBuilders.Add(builder => diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs index 0814dda..75ad261 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs @@ -9,7 +9,7 @@ namespace dotnetCampus.ApplicationStartupManager [DebuggerDisplay("{StartupTaskKey}:{IsVisited},{VisitedFinishTime}")] internal class StartupTaskWrapper : IStartupTaskWrapper { - private readonly StartupManager _manager; + private readonly StartupManagerBase _manager; public HashSet FollowTasks { get; private set; } = new HashSet(); public HashSet Dependencies { get; private set; } = new HashSet(); @@ -25,7 +25,7 @@ namespace dotnetCampus.ApplicationStartupManager public bool UIOnly { get; internal set; } public StartupCriticalLevel CriticalLevel { get; set; } - public StartupTaskWrapper(string startupTaskKey, StartupManager manager) + public StartupTaskWrapper(string startupTaskKey, StartupManagerBase manager) { _manager = manager; StartupTaskKey = startupTaskKey; From 6d4cffd03455a06fe68f9e01bdbdba1fa62f804a Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:42:37 +0800 Subject: [PATCH 10/20] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs index 95e8a47..d9f6924 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs @@ -50,9 +50,8 @@ namespace dotnetCampus.ApplicationStartupManager } } - public void ReportResult(IReadOnlyList wrappers) + public virtual void ReportResult(IReadOnlyList wrappers) { - // todo 还没有具体实现 } } } \ No newline at end of file From 4c5fd58b87ca62b89f533a7a2aa0532d8a2cb641 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:46:07 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs index d9f6924..592fafd 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs @@ -9,14 +9,14 @@ using System.Threading.Tasks; namespace dotnetCampus.ApplicationStartupManager { - public class StartupLogger : IStartupLogger + public class StartupLoggerBase : IStartupLogger { private readonly Stopwatch _mainWatch; private readonly ConcurrentDictionary _milestoneDictionary = new ConcurrentDictionary(); - public StartupLogger() + public StartupLoggerBase() { _mainWatch = new Stopwatch(); _mainWatch.Start(); From 7974af5024eecf8b092884694b83ac6b3c4b41f8 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:47:45 +0800 Subject: [PATCH 12/20] =?UTF-8?q?=E5=B0=86=E8=AE=B0=E5=BD=95=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E7=BB=99=E7=BB=A7=E6=89=BF=E7=B1=BB=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupLogger.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs index 592fafd..5a2d7c1 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs @@ -13,8 +13,8 @@ namespace dotnetCampus.ApplicationStartupManager { private readonly Stopwatch _mainWatch; - private readonly ConcurrentDictionary - _milestoneDictionary = new ConcurrentDictionary(); + protected ConcurrentDictionary + MilestoneDictionary { get; } = new ConcurrentDictionary(); public StartupLoggerBase() { @@ -24,11 +24,11 @@ namespace dotnetCampus.ApplicationStartupManager public void RecordTime(string milestoneName) { - var start = _milestoneDictionary.Count > 0 - ? _milestoneDictionary.Max(x => x.Value.start + x.Value.elapsed) + var start = MilestoneDictionary.Count > 0 + ? MilestoneDictionary.Max(x => x.Value.start + x.Value.elapsed) : 0; var end = _mainWatch.ElapsedTicks; - _milestoneDictionary[milestoneName] = + MilestoneDictionary[milestoneName] = (Thread.CurrentThread.Name ?? Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture), start, end - start); } @@ -46,7 +46,7 @@ namespace dotnetCampus.ApplicationStartupManager { var end = _mainWatch.ElapsedTicks; var elapse = end - begin; - _milestoneDictionary[taskName] = (threadName, begin, elapse); + MilestoneDictionary[taskName] = (threadName, begin, elapse); } } From 20cb0aadb7d21aa16c348aed9703f61c7fdd2c2b Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 14:51:51 +0800 Subject: [PATCH 13/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs index 5a2d7c1..0053f61 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupLogger.cs @@ -13,7 +13,7 @@ namespace dotnetCampus.ApplicationStartupManager { private readonly Stopwatch _mainWatch; - protected ConcurrentDictionary + protected ConcurrentDictionary MilestoneDictionary { get; } = new ConcurrentDictionary(); public StartupLoggerBase() From 4b11faa71d3e2f387fe5491857185c7346c4eebd Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 15:01:50 +0800 Subject: [PATCH 14/20] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E9=87=8D=E5=86=99=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index fe6b7e5..67cd8f5 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -229,7 +229,7 @@ namespace dotnetCampus.ApplicationStartupManager // return this; //} - public async void Run() + public virtual async void Run() { if (Graph == null) { From 8951f2f58f4ae47bc8f917ae2a8bad5218351b14 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 15:02:28 +0800 Subject: [PATCH 15/20] =?UTF-8?q?Revert=20"=E6=94=AF=E6=8C=81=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E5=86=99=E9=80=BB=E8=BE=91"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit bcc7a7ee853ed3f3777416ea2189a11054c1111d. --- .../StartupManagerBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index 67cd8f5..fe6b7e5 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -229,7 +229,7 @@ namespace dotnetCampus.ApplicationStartupManager // return this; //} - public virtual async void Run() + public async void Run() { if (Graph == null) { From 7b69f52c069288a52bc0f6b1040f435c4c4779f3 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 15:11:04 +0800 Subject: [PATCH 16/20] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=A1=B9=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index fe6b7e5..d906aaa 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -42,11 +42,12 @@ namespace dotnetCampus.ApplicationStartupManager internal ConcurrentDictionary StartupTaskWrappers { get; } = new ConcurrentDictionary(); - private List Graph { get; set; } + private List? Graph { get; set; } private StartupContext Context { get; } + protected IStartupContext StartupContext => Context; - private IStartupLogger Logger => Context.Logger; + protected IStartupLogger Logger => Context.Logger; public StartupManagerBase(IStartupLogger logger, /*FileConfigurationRepo configurationRepo,*/ Func fastFailAction, IMainThreadDispatcher dispatcher, bool shouldSetThreadPool = true) @@ -73,7 +74,6 @@ namespace dotnetCampus.ApplicationStartupManager Context = new StartupContext(logger, /*configurationRepo,*/ fastFailAction, WaitStartupTaskAsync); - Logger.RecordTime("ManagerInitialized"); } @@ -454,10 +454,9 @@ namespace dotnetCampus.ApplicationStartupManager private static string StartupTypeToKey(Type type) => type.Name.Remove(type.Name.Length - "startup".Length); - internal virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask, IStartupContext context, - bool uiOnly) + internal virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask,IStartupContext context, bool uiOnly) { - return startupTask.JoinAsync(context, uiOnly); + return startupTask.JoinAsync(Context, uiOnly); } } } \ No newline at end of file From 371ed9898736e8a8822441d6339e274a341f879c Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 19:37:31 +0800 Subject: [PATCH 17/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index d906aaa..ec23e79 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -1,4 +1,5 @@ -using System; +#nullable enable +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; From 8faefd8d42a57409f5b13c9973cdee461d1d64a8 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 2 Mar 2022 20:01:40 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=A0=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E4=B8=8B=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index ec23e79..ed62c35 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -188,7 +188,7 @@ namespace dotnetCampus.ApplicationStartupManager wrapper.TaskBase = new NullObjectStartup(); wrapper.Categories = StartupCategory.All; - if (beforeTasks?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries) is string[] before) + if (beforeTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is string[] before) { foreach (var b in before) { @@ -197,7 +197,7 @@ namespace dotnetCampus.ApplicationStartupManager } } - if (afterTasks?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries) is string[] after) + if (afterTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is string[] after) { foreach (var a in after) { @@ -315,7 +315,7 @@ namespace dotnetCampus.ApplicationStartupManager void AddDependencies(StartupTaskWrapper wrapper, string afterTasks) { - foreach (var task in afterTasks.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries) + foreach (var task in afterTasks.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(CompatibleTaskName)) { if (!taskMetadataList.Exists(metadata => metadata.Key == task) @@ -335,7 +335,7 @@ namespace dotnetCampus.ApplicationStartupManager void AddFollowTasks(StartupTaskWrapper wrapper, string beforeTasks) { - foreach (var task in beforeTasks.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries) + foreach (var task in beforeTasks.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(CompatibleTaskName)) { if (!taskMetadataList.Exists(metadata => metadata.Key == task) @@ -455,9 +455,9 @@ namespace dotnetCampus.ApplicationStartupManager private static string StartupTypeToKey(Type type) => type.Name.Remove(type.Name.Length - "startup".Length); - internal virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask,IStartupContext context, bool uiOnly) + internal virtual Task ExecuteStartupTaskAsync(StartupTaskBase startupTask, IStartupContext context, bool uiOnly) { - return startupTask.JoinAsync(Context, uiOnly); + return startupTask.JoinAsync(context, uiOnly); } } } \ No newline at end of file From 8e05644c30494bb731c73b671311cecb296bb340 Mon Sep 17 00:00:00 2001 From: lindexi Date: Thu, 3 Mar 2022 14:51:30 +0800 Subject: [PATCH 19/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E7=9A=84=E5=8F=AF=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 9 ++++----- .../StartupTaskAttribute.cs | 12 ++++++------ .../StartupTaskBase.cs | 6 +++++- .../StartupTaskHelper.cs | 7 ++++++- .../StartupTaskMetadata.cs | 16 +++------------- .../StartupTaskWrapper.cs | 4 +++- ...dotnetCampus.ApplicationStartupManager.csproj | 3 ++- 7 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index ed62c35..b542601 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -1,5 +1,4 @@ -#nullable enable -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; @@ -182,13 +181,13 @@ namespace dotnetCampus.ApplicationStartupManager /// 例如,你需要根据不同的启动条件决定不同的启动顺序,那么你可能需要使用此方法动态生成关键节点。 /// /// - public StartupManagerBase AddCriticalNodes(string nodeName, string beforeTasks = null, string afterTasks = null) + public StartupManagerBase AddCriticalNodes(string nodeName, string? beforeTasks = null, string? afterTasks = null) { var wrapper = GetStartupTaskWrapper(nodeName); wrapper.TaskBase = new NullObjectStartup(); wrapper.Categories = StartupCategory.All; - if (beforeTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is string[] before) + if (beforeTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is { } before) { foreach (var b in before) { @@ -197,7 +196,7 @@ namespace dotnetCampus.ApplicationStartupManager } } - if (afterTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is string[] after) + if (afterTasks?.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) is { } after) { foreach (var a in after) { diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskAttribute.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskAttribute.cs index bbef24f..8370c12 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskAttribute.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskAttribute.cs @@ -9,12 +9,12 @@ namespace dotnetCampus.ApplicationStartupManager /// /// 此启动任务的任务必须在指定的其他启动任务之前完成。可以使用 “;” 分隔符指定多个启动任务。 /// - public string BeforeTasks { get; set; } + public string? BeforeTasks { get; set; } /// /// 效果上等同于 属性,此属性只是为了开发方便而已 /// - public string[] BeforeTaskList + public string[]? BeforeTaskList { set { @@ -22,19 +22,19 @@ namespace dotnetCampus.ApplicationStartupManager } get { - return BeforeTasks.Split(';'); + return BeforeTasks?.Split(';'); } } /// /// 此启动任务的任务将在指定的其他启动任务之后开始执行。可以使用 “;” 分隔符指定多个启动任务。 /// - public string AfterTasks { get; set; } + public string? AfterTasks { get; set; } /// /// 效果上等同于 属性,此属性只是为了开发方便而已 /// - public string[] AfterTaskList + public string[]? AfterTaskList { set { @@ -42,7 +42,7 @@ namespace dotnetCampus.ApplicationStartupManager } get { - return AfterTasks.Split(';'); + return AfterTasks?.Split(';'); } } diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs index 4fd4aea..b5f1527 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskBase.cs @@ -38,16 +38,20 @@ namespace dotnetCampus.ApplicationStartupManager protected internal static Task CompletedTask => #if NETFRAMEWORK CompletedCommonTask; +#pragma warning disable IDE0032 // Use auto property private static readonly Task CompletedCommonTask = Task.FromResult(true); +#pragma warning restore IDE0032 // Use auto property #else Task.CompletedTask; #endif public Task TaskResult => CompletedSource.Task; - private TaskCompletionSource CompletedSource { get; } = new TaskCompletionSource(); + private TaskCompletionSource CompletedSource { get; } = new TaskCompletionSource(); internal IStartupManager Manager { get; set; } + // 框架注入,一定不为空 + = null!; protected TValue FetchValue() where TStartup : StartupTaskBase, IStartupValueProvider { diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskHelper.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskHelper.cs index 8d83381..945a967 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskHelper.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskHelper.cs @@ -2,8 +2,13 @@ { static class StartupTaskHelper { - public static string BuildTasks(params string[] taskList) + public static string? BuildTasks(params string[]? taskList) { + if (taskList is null) + { + return null; + } + if (taskList.Length > 1) { return string.Join(";", taskList); diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs index c71a36c..7b0a7d0 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskMetadata.cs @@ -9,8 +9,6 @@ namespace dotnetCampus.ApplicationStartupManager public class StartupTaskMetadata { private readonly Lazy _taskLazy; - private string _afterTasks; - private string _beforeTasks; /// /// 创建 的新实例。 @@ -31,27 +29,19 @@ namespace dotnetCampus.ApplicationStartupManager public string Key { get; } /// - /// 获取 的值, + /// 获取 Categories 的值 /// public StartupCategory Categories { get; set; } = StartupCategory.All; /// /// 获取 的值,如果没有标记,则为 null。 /// - public string BeforeTasks - { - get => _beforeTasks; - set => _beforeTasks = value; - } + public string? BeforeTasks { get; set; } /// /// 获取 的值,如果没有标记,则为 null。 /// - public string AfterTasks - { - get => _afterTasks; - set => _afterTasks = value; - } + public string? AfterTasks { get; set; } /// /// 获取 的值,如果没有标记,则为 。 diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs index 75ad261..b7ef48c 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupTaskWrapper.cs @@ -21,7 +21,9 @@ namespace dotnetCampus.ApplicationStartupManager public StartupCategory Categories { get; internal set; } = StartupCategory.All; - public StartupTaskBase TaskBase { get; internal set; } + public StartupTaskBase TaskBase { get; internal set; } + // 框架注入,一定不为空 + = null!; public bool UIOnly { get; internal set; } public StartupCriticalLevel CriticalLevel { get; set; } diff --git a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj index b9d1775..d579113 100644 --- a/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj +++ b/src/dotnetCampus.ApplicationStartupManager/dotnetCampus.ApplicationStartupManager.csproj @@ -5,6 +5,7 @@ true + enable @@ -42,7 +43,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 65f134d1f31dbf2a57e5e211f967700a6548f5a5 Mon Sep 17 00:00:00 2001 From: lindexi Date: Thu, 3 Mar 2022 14:53:29 +0800 Subject: [PATCH 20/20] =?UTF-8?q?=E5=8A=A0=E5=9B=9E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StartupManagerBase.cs | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs index b542601..9bf4996 100644 --- a/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs +++ b/src/dotnetCampus.ApplicationStartupManager/StartupManagerBase.cs @@ -2,10 +2,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Linq; -using System.Net.Mime; -using System.Reflection; using System.Threading; using System.Threading.Tasks; //using dotnetCampus.Configurations.Core; @@ -216,18 +213,11 @@ namespace dotnetCampus.ApplicationStartupManager // return this; //} - //public StartupManagerBase ForStartupTasksOfCategory(StartupCategory category, - // Action taskBuilder) - //{ - // _additionalBuilders.Add(builder => - // { - // if (builder.Categories == category) - // { - // taskBuilder(builder); - // } - // }); - // return this; - //} + public StartupManagerBase ForStartupTasksOfCategory(Action taskBuilder) + { + _additionalBuilders.Add(taskBuilder); + return this; + } public async void Run() {