调度器启动时再解析处理类实例

This commit is contained in:
大石头 2025-07-14 11:40:16 +08:00
parent 91ad9b01cd
commit f4421ae13d
1 changed files with 21 additions and 13 deletions

View File

@ -1,4 +1,5 @@
using AntJob.Data;
using System;
using AntJob.Data;
using AntJob.Handlers;
using AntJob.Providers;
using NewLife;
@ -8,6 +9,7 @@ using NewLife.Model;
using NewLife.Reflection;
using NewLife.Threading;
using Stardust.Registry;
using static NewLife.Remoting.ApiHttpClient;
namespace AntJob;
@ -52,18 +54,9 @@ public class Scheduler : DisposeBase
/// <typeparam name="T"></typeparam>
public Scheduler AddHandler<T>() where T : Handler
{
var prv = ServiceProvider;
if (prv == null)
{
var services = ObjectContainer.Current;
prv = ObjectContainer.Provider;
services.AddTransient<T>();
}
// 马上实例化
var handler = prv.GetService<T>() ?? prv.CreateInstance(typeof(T)) as T;
Handlers.Add(handler);
// 把服务类型注册到容器中,以便后续获取
var ioc = ServiceProvider?.GetService<IObjectContainer>() ?? ObjectContainer.Current;
ioc.AddTransient<Handler, T>();
return this;
}
@ -154,6 +147,21 @@ public class Scheduler : DisposeBase
private void OnStart()
{
// 从容器中获取所有服务
foreach (var item in ServiceProvider.GetServices<Handler>())
{
Handlers.Add(item);
}
// 有可能DI中注入IObjectContainer后者再次注册Handler
var ioc = ServiceProvider?.GetService<IObjectContainer>();
if (ioc != null && ioc.GetType().Namespace != ServiceProvider?.GetType().Namespace)
{
foreach (var item in ServiceProvider.GetServices<Handler>())
{
Handlers.Add(item);
}
}
// 检查本地添加的处理器
var hs = Handlers;
if (hs.Count == 0) throw new ArgumentNullException(nameof(Handlers), "没有可用处理器");