完善ITaskManager模块,经过测试

This commit is contained in:
Falcon 2025-04-21 17:08:56 +08:00
parent 4ece07fa8c
commit c2370a6e6f
7 changed files with 93 additions and 7 deletions

View File

@ -0,0 +1,53 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Falcon.SugarApi.ServiceCollectionExtend
{
/// <summary>
/// 单实例多接口注册
/// </summary>
public static class AddSingletonWithExtend
{
/// <summary>
/// 单实例+多接口注册。
/// </summary>
/// <typeparam name="TInstance">实例的类型</typeparam>
/// <param name="services">服务集合</param>
/// <param name="serviceTypes">要注册的服务类型,必须为接口</param>
/// <returns>服务集合</returns>
public static IServiceCollection AddSingletonWith<TInstance>(this IServiceCollection services,params Type[] serviceTypes)
where TInstance : class {
services.TryAddSingleton<TInstance>();
foreach(var t in serviceTypes) {
if(!t.IsInterface)
throw new ArgumentException($"类型 {t.FullName} 不是接口");
if(typeof(TInstance).GetInterfaces().Contains(t)) {
services.AddSingleton(t,p => p.GetRequiredService<TInstance>());
}
}
return services;
}
/// <summary>
/// 单实例+多接口注册。
/// </summary>
/// <typeparam name="TInstance">实例的类型</typeparam>
/// <param name="services">服务集合</param>
/// <param name="instance">实例对象</param>
/// <param name="serviceTypes">要注册的接口类型</param>
/// <returns>服务集合</returns>
public static IServiceCollection AddSingletonWith<TInstance>(this IServiceCollection services,TInstance instance,params Type[] serviceTypes)
where TInstance : class {
services.TryAddSingleton<TInstance>(instance);
foreach(var t in serviceTypes) {
if(typeof(TInstance).GetInterfaces().Contains(t)) {
services.AddSingleton(t,p => p.GetRequiredService<TInstance>());
}
}
return services;
}
}
}

View File

@ -1,7 +1,7 @@
using System.Threading;
using System.Threading.Tasks;
namespace Falcon.SugarApi.TimedTask
namespace Falcon.SugarApi.TimedTask.TaskManager
{
/// <summary>
/// 任务管理接口

View File

@ -1,6 +1,6 @@
using System;
namespace Falcon.SugarApi.TimedTask
namespace Falcon.SugarApi.TimedTask.TaskManager
{
/// <summary>
/// 任务上次运行结果信息

View File

@ -0,0 +1,5 @@
## 后台任务模块 TimedTask 任务管理
插件中的后台任务需要实现ITaskManager接口。
然后使用Servers.AddTaskWithManager进行注册。没有实现ITaskManager的后台任务可以直接使用Services.AddHostedService进行注册。

View File

@ -0,0 +1,24 @@
using Falcon.SugarApi.ServiceCollectionExtend;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Falcon.SugarApi.TimedTask.TaskManager
{
/// <summary>
/// 服务注册扩展
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// 注册后台任务服务,并同时注册任务管理
/// </summary>
/// <typeparam name="T">后台任务的类型</typeparam>
/// <param name="services">服务集合</param>
/// <returns>服务集合</returns>
public static IServiceCollection AddTimedTaskWithManager<T>(this IServiceCollection services)
where T : class {
services.AddSingletonWith<T>(typeof(IHostedService),typeof(ITaskManager));
return services;
}
}
}

View File

@ -1,6 +1,6 @@
using System;
namespace Falcon.SugarApi.TimedTask
namespace Falcon.SugarApi.TimedTask.TaskManager
{
/// <summary>
/// 任务控制返回结果

View File

@ -1,10 +1,14 @@
namespace Falcon.SugarApi.TimedTask
namespace Falcon.SugarApi.TimedTask.TaskManager
{
/// <summary>
/// 任务状态
/// </summary>
public enum TaskState
{
/// <summary>
/// 任务准备中
/// </summary>
Init,
/// <summary>
/// 准备-任务准备就绪等待开始执行
/// </summary>
@ -18,7 +22,7 @@
/// </summary>
Running,
/// <summary>
/// 停止-任务已经停止,不会再运行
/// 停止-任务停止状态,可再次运行
/// </summary>
Stopping,
/// <summary>