假設:
Library1(Class Library),命名空間 Library1,類別 Class1,方法 public void DoWork()。WindowsFormApp1(WinForms),命名空間 WindowsFormApp1,需呼叫 DoWork。// WindowsFormApp1 專案 → 參考 → 加入參考 → 專案 → 勾選 Library1
using Library1; // 頂部引入命名空間
public void OnButtonClick() {
var helper = new Class1(); // 實例化
helper.DoWork(); // 呼叫實例方法
}
// Library1.Class1
public static void DoStaticWork() { ... }
// WindowsFormApp1
using Library1;
public void OnButtonClick() {
Class1.DoStaticWork(); // 類別名.方法名,無需實例化
}
// Library1
public interface IWorker { void DoWork(); }
public class Class1 : IWorker { public void DoWork() { ... } }
// WindowsFormApp1 (使用 Microsoft.Extensions.DependencyInjection)
services.AddTransient();
// Controller/Form 建構子注入
private readonly IWorker _worker;
public Form1(IWorker worker) { _worker = worker; }
public void OnButtonClick() { _worker.DoWork(); }
// Library1
public class Class1 {
public event Action OnProgress;
public void DoWork() {
for (int i=0;i<100;i++) OnProgress?.Invoke($"進度 {i}%");
}
}
// WindowsFormApp1
var helper = new Class1();
helper.OnProgress += msg => this.Invoke(() => lblStatus.Text = msg);
helper.DoWork();
| 需求 | 推薦模式 |
|---|---|
| 簡單工具類、無狀態 | 模式二 靜態方法 |
| 有狀態、需多實例、可測試 | 模式一 實例化 |
| 多實作切換、單元測試 Mock、解耦 | 模式三 介面+DI |
| 非同步進度回報、事件通知、插件擴展 | 模式四 委派/事件 |
namespace xxx,完全複製。public(或 internal 同組件)。Control.Invoke 或 Dispatcher.Invoke 切回 UI 執行緒。