ScheduleTaskHelper.Core 1.0.7

dotnet add package ScheduleTaskHelper.Core --version 1.0.7
                    
NuGet\Install-Package ScheduleTaskHelper.Core -Version 1.0.7
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ScheduleTaskHelper.Core" Version="1.0.7" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ScheduleTaskHelper.Core" Version="1.0.7" />
                    
Directory.Packages.props
<PackageReference Include="ScheduleTaskHelper.Core" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ScheduleTaskHelper.Core --version 1.0.7
                    
#r "nuget: ScheduleTaskHelper.Core, 1.0.7"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ScheduleTaskHelper.Core@1.0.7
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ScheduleTaskHelper.Core&version=1.0.7
                    
Install as a Cake Addin
#tool nuget:?package=ScheduleTaskHelper.Core&version=1.0.7
                    
Install as a Cake Tool

ScheduleTaskHelper - 資料同步服務

📘 專案概述

ScheduleTaskHelper 是一個專注於資料同步的高效排程工具,支援 Cron 表達式與定時任務排程,具備錯誤重試、分散式鎖機制及同步狀態監控功能。其插件式架構允許動態擴展,適用於多節點部署環境。核心功能包括任務優先級管理、資料一致性驗證及重試佇列,並提供靈活的配置與高效能的執行管理。

🛠️ 主要功能

  • 自動化資料同步排程
  • 支援 Cron 表達式的任務排程
  • 錯誤處理和重試機制
  • 同步狀態監控與記錄
  • 資料一致性驗證
  • 插件式架構,支援動態擴展
  • 分散式鎖機制
  • 任務重試佇列

🏗️ 架構設計

核心元件

1. 工作群組管理器 (WorkerGroup)
WorkerGroup
├── 任務佇列管理
├── 優先級排序
└── 背景執行緒控制

關鍵特性:

  • 使用SortedDictionary實現優先級佇列
  • 基於背景執行緒的任務處理
  • 執行緒安全的佇列操作
  • 支援任務的動態新增和移除

實作細節:

  • _taskQueue: 使用SortedDictionary<int, Queue<IScheduledTask>>實現優先級佇列
  • _lock: 使用物件鎖確保執行緒安全
  • _signal: 使用AutoResetEvent控制執行緒同步
  • WorkerLoop: 背景執行緒的主要處理邏輯
2. 排程執行池 (ScheduledThreadPool)

關鍵特性:

  • 管理多個工作群組
  • 支援定時任務排程
  • 支援 Cron 表達式排程
  • 控制任務執行順序
  • 防止任務重疊執行
  • 確保準確的時間點執行

實作細節:

  • _groups: 管理不同的工作群組
  • _timers: 管理任務計時器
  • _taskStates: 追蹤每個任務的執行狀態
  • Schedule(): 基於時間間隔的排程方法
  • ScheduleCron(): 基於 Cron 表達式的排程方法
3. 任務執行狀態管理 (TaskExecutionState)

關鍵特性:

  • 追蹤任務執行狀態
  • 防止任務重疊執行
  • 記錄上次執行時間和下次排程時間

實作細節:

  • LastExecutionTime: 記錄任務最後一次執行時間
  • NextScheduledTime: 儲存任務下次排程時間
  • IsExecuting: 標記任務當前是否正在執行中
4. 排程任務 (Scheduled Tasks)
4.1 基礎任務介面與類別
  • IScheduledTask: 定義基本任務介面
  • ICronScheduledTask: 擴展支援 Cron 表達式的任務介面
  • BaseTask: 實現基本任務功能的抽象類別
  • BaseCronTask: 實現 Cron 任務功能的抽象類別
5. Cron 表達式支援

關鍵特性:

  • 支援標準 NCrontab 格式的 Cron 表達式
  • 提供常用排程模式的預定義表達式
  • 基於 NCrontab 庫實現表達式解析

實作細節:

  • CronUtils: Cron 表達式解析工具
  • CronExpressions: 常用 Cron 表達式常數
  • GetNextExecution(): 計算下一次執行時間
6. 插件架構 (Plugin Architecture)

關鍵特性:

  • 支援動態載入外部任務插件
  • 可配置的插件管理
  • 熱插拔能力
  • 任務執行優先級配置

實作細節:

  • IPlugin: 插件介面,定義插件功能
  • BasePlugin: 基本插件抽象類別,簡化插件開發
  • PluginLoader: 負責發現和載入插件
  • PluginConfiguration: 插件配置管理
  • PluginTaskInfo: 插件任務信息定義

更新:

  • GetAvailableTasks 方法現在支援從 pluginconfig.json 動態加載任務。
  • 詳細說明:
    • pluginconfig.json 中的 TaskConfigurations 定義了所有任務的配置。
    • 系統會根據 Enabled 屬性自動加載啟用的任務。

範例:

{
  "TaskConfigurations": {
    "ScheduledTask": {
      "Enabled": true,
      "Group": "SyncTasks",
      "Priority": 1,
      "InitialDelay": "00:00:10",
      "Period": "00:05:00"
    },
    "CronTask": {
      "Enabled": false,
      "Group": "SyncTasks",
      "Priority": 2,
      "CronExpression": "0 */5 * * * *"
    }
  }
}
7. 分散式鎖機制 (Distributed Lock)

關鍵特性:

  • 支援多節點部署環境下的任務執行互斥
  • 防止同一任務在不同節點上並發執行
  • 支援鎖過期自動釋放
  • 支援鎖自動延期
  • 優雅處理鎖獲取失敗

實作細節:

  • IDistributedLockProvider: 分散式鎖提供者介面
  • IDistributedLock: 分散式鎖介面
  • InMemoryDistributedLockProvider: 基於記憶體的鎖實作,適用於單節點環境
  • RedisDistributedLockProvider: 基於 Redis 的鎖實作,適用於多節點環境
  • 鎖獲取和釋放過程的異步支持
  • 指數退避重試策略
8. 任務重試佇列 (Task Retry Queue)

關鍵特性:

  • 自動管理失敗任務的重試
  • 支援指數退避重試間隔
  • 可配置最大重試次數
  • 失敗後的事件通知
  • 詳細的執行統計和日誌

實作細節:

  • TaskRetryQueue: 重試佇列實作
  • RetryTaskInfo: 重試任務信息
  • 基於定時器的重試調度
  • 並行度控制
  • 任務優先級處理

⚙️ 程式碼說明

1. 排程任務介面 (IScheduledTask.cs)

public interface IScheduledTask
{
    string Name { get; }       // 任務唯一識別名稱
    string Group { get; }      // 任務群組
    TimeSpan InitialDelay { get; }
    TimeSpan Period { get; }
    int Priority { get; }      // 群組內排序用

    Task<int> Execute();
    void Stop();
}
  • 定義基本任務介面
  • 支援任務名稱、群組和優先級
  • 提供執行和停止方法

2. Cron 排程任務介面 (ICronScheduledTask.cs)

public interface ICronScheduledTask : IScheduledTask
{
    bool Immediate { get; }
    string CronExpression { get; }
    DateTime GetNextExecution(DateTime now);
}
  • 擴展基本任務介面
  • 支援 Cron 表達式
  • 提供計算下一次執行時間的方法

3. 工作群組 (WorkerGroup.cs)

public class WorkerGroup
{
    private readonly SortedDictionary<int, Queue<IScheduledTask>> _taskQueue;
    private readonly object _lock = new object();
    private readonly AutoResetEvent _signal = new AutoResetEvent(false);
    private readonly IDistributedLockProvider _lockProvider;
    private readonly TaskRetryQueue _retryQueue;
    // ...
    
    private async void WorkerLoop()
    {
        while (_running)
        {
            // ...獲取任務...
            
            // 嘗試獲取分散式鎖
            IDistributedLock lock = await _lockProvider.TryAcquireLockAsync(resourceName, owner, expiryTime);
            if (lock != null)
            {
                try
                {
                    // 執行任務
                    result = await task.Execute();
                }
                catch (Exception ex)
                {
                    // 添加到重試佇列
                    await _retryQueue.AddForRetryAsync(task, ex);
                }
                finally
                {
                    // 釋放鎖
                    await lock.ReleaseAsync();
                }
            }
        }
    }
}
  • 實現任務佇列管理和執行
  • 支援優先級排序
  • 提供執行緒安全的操作
  • 整合分散式鎖和重試機制

4. 排程執行池 (ScheduledThreadPool.cs)

public class ScheduledThreadPool
{
    private readonly Dictionary<string, WorkerGroup> _groups;
    private readonly Dictionary<string, Timer> _timers;
    private readonly Dictionary<string, TaskExecutionState> _taskStates;
    private readonly IDistributedLockProvider _lockProvider;
    private readonly TaskRetryQueue _retryQueue;
    // ...
    
    private class TaskExecutionState
    {
        public DateTime LastExecutionTime { get; set; } = DateTime.MinValue;
        public DateTime NextScheduledTime { get; set; } = DateTime.MinValue;
        public bool IsExecuting { get; set; } = false;
        public int ExecutionCount { get; set; } = 0;
        public int SuccessCount { get; set; } = 0;
        public int FailureCount { get; set; } = 0;
    }
}
  • 管理多個工作群組
  • 支援定時任務排程
  • 支援 Cron 表達式排程
  • 追蹤任務執行狀態,防止任務重疊執行
  • 整合分散式鎖和重試佇列的創建

5. 任務重疊處理機制

當任務執行時間到達,但前一個任務實例尚未完成時,系統會採取以下處理策略:

// 檢查任務是否正在執行中
if (state.IsExecuting)
{
    taskBusy = true;
    
    // 記錄任務重疊執行的情況
    LogWarning($"任務 {task.Name} 的上一個執行實例仍在運行中,跳過本次執行");
    
    // 更新下次執行時間為下一個排程點
    DateTime currentTime = DateTime.Now;
    state.NextScheduledTime = task.GetNextExecution(currentTime);
    LogWarning($"任務 {task.Name} 的下次執行時間已調整為: {state.NextScheduledTime:yyyy-MM-dd HH:mm:ss}");
}
  • 檢測任務是否處於執行中狀態
  • 如果任務正在執行中,則跳過此次執行
  • 計算並排程下一次執行時間
  • 記錄詳細的日誌信息,方便監控和調試

6. Cron 工具類 (CronUtils.cs)

public static class CronUtils
{
    public static DateTime GetNextOccurrence(string cronExpression, DateTime baseTime)
    {
        // Cron 表達式解析邏輯...
        var schedule = CrontabSchedule.Parse(cronExpression, parseOptions);
        var nextOccurrence = schedule.GetNextOccurrence(baseTime);
        // 確保下次執行時間不是當前時間(防止秒級重複執行)
        // ...
        return nextOccurrence;
    }
}
  • 提供 Cron 表達式解析功能
  • 計算下一次執行時間
  • 包含驗證機制,確保表達式解析準確

7. 插件架構 (Plugins)

7.1 插件介面 (IPlugin.cs)
public interface IPlugin
{
    IPluginMetadata Metadata { get; }
    Task<bool> InitializeAsync(IServiceCollection services);
    void RegisterServices(IServiceCollection services);
    IEnumerable<PluginTaskInfo> GetAvailableTasks();
    Task ShutdownAsync();
}
  • 定義插件的基本功能
  • 支援插件初始化和關閉
  • 提供任務註冊機制
7.2 插件載入器 (PluginLoader.cs)
public class PluginLoader
{
    private readonly Dictionary<string, IPlugin> _loadedPlugins = new Dictionary<string, IPlugin>();
    // ...
    
    public async Task<int> LoadPluginsAsync()
    {
        // 載入插件的邏輯...
    }
    
    public void RegisterTasks(IServiceCollection services)
    {
        // 註冊插件任務的邏輯...
    }
}
  • 負責發現和載入插件
  • 支援動態載入外部程式集
  • 管理插件生命週期
7.3 插件配置 (PluginConfiguration.cs)
public class PluginConfiguration
{
    public List<string> EnabledPlugins { get; set; } = new List<string>();
    public Dictionary<string, TaskConfiguration> TaskConfigurations { get; set; } = new Dictionary<string, TaskConfiguration>();
    
    // 載入和保存配置的方法...
}

public class TaskConfiguration
{
    public bool Enabled { get; set; } = true;
    public string? CronExpression { get; set; }
    public TimeSpan? InitialDelay { get; set; }
    public TimeSpan? Period { get; set; }
    public int? Priority { get; set; }
    public string? Group { get; set; }
    public bool? ExecuteImmediately { get; set; }
    public Dictionary<string, object>? Parameters { get; set; } = new Dictionary<string, object>();
}
  • 管理插件啟用狀態
  • 配置個別任務參數
  • 支援配置檔的載入和保存
  • 使用自訂 JSON 轉換器處理 TimeSpan 序列化

8. 分散式鎖 (Distributed Lock)

8.1 分散式鎖介面 (IDistributedLockProvider.cs)
public interface IDistributedLockProvider
{
    Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime);
    Task<IDistributedLock> AcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime, TimeSpan timeout, CancellationToken cancellationToken = default);
}

public interface IDistributedLock : IAsyncDisposable
{
    string ResourceName { get; }
    string Owner { get; }
    DateTime AcquiredTime { get; }
    DateTime ExpiryTime { get; }
    Task<bool> ExtendExpiryTimeAsync(TimeSpan expiryTime);
    Task<bool> ReleaseAsync();
}
  • 定義分散式鎖的核心功能
  • 支援嘗試獲取鎖、等待獲取鎖
  • 支援鎖延期和釋放
8.2 記憶體內分散式鎖 (InMemoryDistributedLockProvider.cs)
public class InMemoryDistributedLockProvider : IDistributedLockProvider
{
    private static readonly ConcurrentDictionary<string, InMemoryDistributedLock> _locks = new();
    
    public async Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime)
    {
        // 嘗試獲取鎖的實現...
    }
    
    private class InMemoryDistributedLock : IDistributedLock
    {
        // 記憶體內鎖的實現...
    }
}
  • 單節點環境下的分散式鎖實現
  • 使用 ConcurrentDictionary 儲存鎖
  • 支援鎖過期自動清理
8.3 Redis 分散式鎖 (RedisDistributedLockProvider.cs)
public class RedisDistributedLockProvider : IDistributedLockProvider
{
    private readonly IConnectionMultiplexer _redis;
    
    public async Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime)
    {
        // 使用 Redis 實現分散式鎖...
    }
    
    private class RedisDistributedLock : IDistributedLock
    {
        // 支援看門狗自動延長鎖時間...
    }
}
  • 多節點環境下的分散式鎖實現
  • 使用 Redis SET NX 命令
  • 實現看門狗機制自動延長鎖
  • 使用 Lua 腳本確保操作原子性

9. 任務重試佇列 (TaskRetryQueue.cs)

public class TaskRetryQueue : IDisposable
{
    private readonly ConcurrentDictionary<string, RetryTaskInfo> _retryTasks = new();
    private readonly Timer _retryTimer;
    private readonly int _maxRetries;
    
    public async Task<bool> AddForRetryAsync(IScheduledTask task, Exception error, TimeSpan? nextRetryDelay = null)
    {
        // 添加任務到重試佇列...
    }
    
    private async void CheckRetryQueue(object? state)
    {
        // 檢查重試佇列並執行到期的重試任務...
    }
}

public class RetryTaskInfo
{
    public IScheduledTask Task { get; set; } = null!;
    public int RetryCount { get; set; }
    public DateTime FirstFailureTime { get; set; }
    public DateTime LastFailureTime { get; set; }
    public DateTime NextRetryTime { get; set; }
    public Exception LastError { get; set; } = null!;
}
  • 管理失敗任務的重試
  • 指數退避重試策略
  • 最大重試次數限制
  • 詳細的任務重試狀態追蹤

🔧 配置說明

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "Redis": "localhost:6379,abortConnect=false"
  },
  "RedisLockOptions": {
    "KeyPrefix": "tradevan:lock:",
    "AutoExtend": true,
    "DefaultExpiryTime": "00:00:30"
  },
  "RetryQueueOptions": {
    "CheckInterval": "00:00:10",
    "MaxRetries": 3
  }

}

插件配置檔 (pluginconfig.json)

{
  "EnabledPlugins": [
    "TradeVanSync.SamplePlugin"
  ],
  "TaskConfigurations": {
    "SampleTask": {
      "Enabled": true,
      "Group": "SampleTasks",
      "Priority": 1,
      "InitialDelay": "00:00:10",
      "Period": "00:05:00"
    },
    "SampleCronTask": {
      "Enabled": true,
      "Group": "SampleTasks",
      "CronExpression": "0 */5 * * * *",
      "ExecuteImmediately": true
    }
  }
}
插件配置檔案格式說明
  1. EnabledPlugins: 列出所有已啟用的插件ID

    • 每個插件由其唯一ID識別
    • 未列出的插件即使存在也不會被載入
  2. TaskConfigurations: 個別任務的配置

    • 鍵是任務ID
    • 值是TaskConfiguration對象,包含以下屬性:
      • Enabled: 是否啟用此任務(布林值)
      • Group: 任務群組名稱
      • Priority: 執行優先級
      • InitialDelay: 首次執行前的延遲時間(格式: "HH:mm:ss")
      • Period: 定期任務的執行間隔(格式: "HH:mm:ss")
      • CronExpression: Cron任務的排程表達式
      • ExecuteImmediately: Cron任務是否在啟動時立即執行
      • Parameters: 任務專用參數,可自訂

主要配置項目

配置項目 說明 預設值
DevMode 開發模式開關,決定使用沙箱或正式環境 false
SanxboxEndpoint 沙箱環境 API 端點 https://pmspmia.tradevan.com.tw/APMIA/
ProductEndpoint 正式環境 API 端點 https://pms.ia.gov.tw/APMIA/
Secret API 密鑰 需要配置
ConnectionStrings:Redis Redis 連線字串 null (空字串使用記憶體內鎖)
RedisLockOptions:KeyPrefix Redis 鎖鍵前綴 tradevan:lock:
RedisLockOptions:AutoExtend 是否自動延長鎖時間 true
RedisLockOptions:DefaultExpiryTime 默認鎖過期時間 00:00:30 (30秒)
RetryQueueOptions:CheckInterval 重試佇列檢查間隔 00:00:10 (10秒)
RetryQueueOptions:MaxRetries 最大重試次數 3

🚀 效能考量

  1. 記憶體管理

    • 使用佇列控制記憶體使用
    • 實作資料批次處理
    • 適當的記憶體回收策略
  2. 執行緒優化

    • 使用執行緒池
    • 避免執行緒阻塞
    • 最佳化同步操作
  3. 資料庫操作

    • 批次更新機制
    • 交易管理
    • 連線池優化
  4. 任務執行管理

    • 防止任務重疊執行
    • 精確計時的時間排程
    • 自動處理錯過的執行時間
    • 分散式鎖確保多節點部署安全
  5. 錯誤處理與重試

    • 智能重試策略
    • 指數退避算法
    • 失敗記錄與通知

🔄 可擴展性設計

  1. 模組化架構

    • 易於添加新的同步任務
    • 可配置的任務參數
    • 彈性的資料處理邏輯
  2. 介面抽象

    • IScheduledTask 介面定義標準任務合約
    • ICronScheduledTask 介面擴展 Cron 排程功能
    • IDistributedLock 介面定義分散式鎖功能
    • 可擴展的資料處理管道
    • 可替換的元件實作
  3. 事件驅動架構

    • 基於 EventBus 的事件發佈與訂閱
    • 支援同步和非同步事件處理
    • 任務生命週期事件通知
  4. 插件式架構

    • 支援動態載入外部插件
    • 熱插拔式設計
    • 允許第三方擴展
    • 獨立部署和更新

💡 改進建議

1. 架構優化

  • 實作任務重試佇列
  • 添加分散式鎖機制
  • 實作事件驅動架構
  • 防止任務重疊執行機制
  • 支援插件式架構

2. 效能提升

  • 實作非同步I/O操作
  • 優化記憶體使用
  • 添加快取機制
  • 優化任務執行時間計算

3. 監控與維護

  • 實作健康檢查端點
  • 加強日誌記錄
  • 添加效能指標收集
  • 任務執行狀態監控

4. 錯誤處理

  • 實作更細緻的錯誤分類
  • 添加自動復原機制
  • 強化資料驗證
  • 改進任務錯誤處理邏輯

5. 擴展性

  • 支援插件式架構
  • 實作設定熱重載
  • 添加動態任務調度
  • 任務執行狀態管理
  • 修復插件配置的 JSON 序列化問題

📑 API文件

Plugin API

  • IPlugin: 插件介面
  • BasePlugin: 插件基類
  • PluginLoader: 插件載入器
  • PluginConfiguration: 插件配置

Distributed Lock API

  • IDistributedLockProvider: 分散式鎖提供者介面
  • IDistributedLock: 分散式鎖介面

Task Retry API

  • TaskRetryQueue: 任務重試佇列
  • RetryTaskInfo: 重試任務資訊

🔒 安全性考量

  1. 資料安全

    • API金鑰管理
    • 敏感資料加密
    • 存取權限控制
  2. 系統安全

    • 異常監控
    • 存取日誌
    • 資源限制
  3. 插件安全

    • 插件簽名驗證
    • 沙箱隔離
    • 資源使用限制
  4. 分散式架構安全

    • 節點認證
    • 分散式鎖資源隔離
    • 超時處理策略

❓ 故障排除

常見問題

  1. 同步失敗

    • 檢查網路連線
    • 驗證API認證
    • 查看錯誤日誌
  2. 效能問題

    • 監控資源使用
    • 檢查資料庫效能
    • 分析執行緒狀態
  3. 排程執行問題

    • 檢查 CRON 表達式正確性
    • 確認任務執行狀態
    • 分析日誌中的時間記錄
    • 監控是否有任務重疊執行警告
  4. 插件載入問題

    • 檢查插件相容性
    • 確認依賴項目已滿足
    • 檢查插件目錄權限
    • 確保插件配置檔案格式正確
  5. 分散式鎖問題

    • 檢查 Redis 連線狀態
    • 確認鎖過期時間設置
    • 查看鎖獲取與釋放日誌
  6. 任務重試問題

    • 檢查重試間隔配置
    • 確認任務是否為冪等操作
    • 監控重試次數和失敗原因

📊 效能基準

  • 單次同步處理能力: 1000筆/分鐘
  • 平均回應時間: < 100ms
  • 記憶體使用上限: 1GB
  • CPU使用率: < 30%

📝 版本歷程

v1.0.0

  • 初始版本發布
  • 基本同步功能實作
  • 錯誤處理機制

v1.1.0

  • 新增 Cron 表達式支援
  • 優化任務排程機制
  • 增強錯誤處理功能

v1.2.0

  • 優化 Cron 表達式解析與執行
  • 新增任務重疊執行防護機制
  • 改進事件驅動架構
  • 增強任務執行狀態監控

v1.3.0

  • 實作插件式架構
  • 支援動態載入外部插件
  • 插件配置管理
  • 改進任務執行監控

v1.3.1

  • 修復插件配置 JSON 序列化/反序列化問題
  • 改進 TimeSpan 類型處理
  • 增強插件配置文檔

v1.4.0

  • 新增分散式鎖機制
  • 實作任務重試佇列
  • 優化事件系統
  • 強化任務執行統計和監控

IPluginStartup 使用說明

IPluginStartup 是一個用於初始化和管理外掛的介面,負責外掛的啟動、服務註冊以及任務的動態加載。此介面主要用於實現外掛的生命週期管理,並支援動態載入與配置。

介面定義

public interface IPluginStartup
{
    /// <summary>
    /// 初始化外掛,註冊必要的服務。
    /// </summary>
    /// <param name="services">DI 容器的服務集合。</param>
    void ConfigureServices(IServiceCollection services);

    /// <summary>
    /// 啟動外掛,執行初始化邏輯。
    /// </summary>
    /// <param name="serviceProvider">DI 容器的服務提供者。</param>
    void Start(IServiceProvider serviceProvider);

    /// <summary>
    /// 停止外掛,釋放資源。
    /// </summary>
    void Stop();
}

使用方式

  1. 實作 IPluginStartup
    • 每個外掛需實作 IPluginStartup 介面,並提供初始化、啟動和停止的邏輯。
    • 例如:
public class SamplePluginStartup : IPluginStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 註冊外掛所需的服務
        services.AddSingleton<IScheduledTask, SampleTask>();
    }

    public void Start(IServiceProvider serviceProvider)
    {
        // 啟動外掛邏輯
        Console.WriteLine("SamplePlugin 已啟動");
    }

    public void Stop()
    {
        // 停止外掛邏輯
        Console.WriteLine("SamplePlugin 已停止");
    }
}
  1. 讀取外掛自定義設定檔
    • 外掛可以使用 IConfiguration 來讀取自定義的設定檔,例如 pluginconfig.SamplePlugin.json
    • 例如:
public class SamplePluginStartup : IPluginStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        string pluginDirectory = Path.Combine(AppContext.BaseDirectory, "Plugins", "SamplePlugin");
        string configFilePath = Path.Combine(pluginDirectory, "pluginconfig.SamplePlugin.json");

        if (!File.Exists(configFilePath))
        {
            throw new FileNotFoundException($"設定檔未找到: {configFilePath}");
        }

        var configBuilder = new ConfigurationBuilder()
            .AddJsonFile(configFilePath, optional: false, reloadOnChange: false);

        var configuration = configBuilder.Build();

        // 使用設定
        var pluginSetting = configuration["TestPlugin"];
        Console.WriteLine($"TestPlugin 設定值: {pluginSetting}");

        // 註冊服務
        services.AddScoped<INotify>(provider => new SlackNotify(pluginSetting));
    }

    public void Start(IServiceProvider serviceProvider)
    {
        Console.WriteLine("SamplePlugin 已啟動");
    }

    public void Stop()
    {
        Console.WriteLine("SamplePlugin 已停止");
    }
}

外掛自定義設定檔操作说明

外掛的自定義設定檔通常以 JSON 格式存儲,並由外掛自行讀取和使用。以下是操作說明:

設定檔範例

以下是一個典型的 pluginconfig.SamplePlugin.json 設定檔範例:

{
  "TestPlugin": "https://hooks.slack.com/services/your/webhook/url",
  "RetryCount": 3,
  "EnableLogging": true
}

操作步驟

  1. 新增設定檔

    • 在外掛目錄下新增自定義設定檔,例如 pluginconfig.SamplePlugin.json
    • 確保設定檔的結構符合外掛的需求。
  2. 讀取設定檔

    • IPluginStartupConfigureServices 方法中,使用 ConfigurationBuilder 讀取設定檔。
    • 例如:
var configBuilder = new ConfigurationBuilder()
    .AddJsonFile(configFilePath, optional: false, reloadOnChange: false);
var configuration = configBuilder.Build();
  1. 使用設定
    • IConfiguration 中讀取設定值,並將其用於外掛的初始化邏輯。
    • 例如:
var pluginSetting = configuration["TestPlugin"];
services.AddScoped<INotify>(provider => new SlackNotify(pluginSetting));
  1. 修改設定檔
    • 修改設定檔後,重新啟動服務以加載新的設定。

注意事項

  • 確保設定檔的路徑正確,並與外掛的目錄結構一致。
  • 修改設定檔時,建議備份原始檔案以防止配置錯誤。
  • 若設定檔格式不正確,外掛可能無法正常啟動。
Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.7 115 8/20/2025
1.0.6 106 8/20/2025
1.0.5 109 8/20/2025
1.0.4 105 8/20/2025
1.0.3 106 8/20/2025
1.0.2 103 8/20/2025
1.0.1 105 8/20/2025
1.0.0 108 8/20/2025