Orleans 生命週期概觀
某些 Orleans 行為相當複雜,需要已排序的啟動和關機作業。 某些具有此類行為的元件包括粒紋、定址接收器和用戶端。 為了解決此問題,已引進一般元件生命週期模式。 此模式包含可觀察的生命週期、負責發出元件啟動和關機階段的訊號,以及負責在特定階段執行啟動或關機作業的生命週期觀察者。
可觀察的生命週期
需要排序啟動和關機的元件可以使用可觀察的生命週期,讓其他元件能夠觀察生命週期,並在啟動或關機期間到達階段時收到通知。
public interface ILifecycleObservable
{
IDisposable Subscribe(
string observerName,
int stage,
ILifecycleObserver observer);
}
訂閱呼叫會在啟動或停止且達到階段時註冊觀察者以取得通知。 觀察者的名稱僅供報告之用。 指出在啟動/關機順序中,觀察者會收到通知的階段。 生命週期的每個階段都是可觀察的。 當開始和停止階段且達到階段時,所有觀察者都會收到通知。 階段會以遞增順序啟動,並以遞減順序停止。 觀察者可以處置傳回的可處置項目來取消訂閱。
生命週期觀察者
需要參與另一個元件生命週期的元件,必須為其啟動和關機行為提供勾點,並訂閱可觀察生命週期的特定階段。
public interface ILifecycleObserver
{
Task OnStart(CancellationToken ct);
Task OnStop(CancellationToken ct);
}
當啟動/關機期間達到訂閱的階段時,系統會呼叫 ILifecycleObserver.OnStart 和 ILifecycleObserver.OnStop。
公用程式
為了方便起見,已針對常見的生命週期使用模式建立協助程式函式。
擴充
延伸模組函式可用於訂閱可觀察的生命週期,而不需要訂閱元件實作 ILifecycleObserver。 相反地,這些允許元件傳入 Lambda 或成員函式,以便在訂閱階段呼叫。
IDisposable Subscribe(
this ILifecycleObservable observable,
string observerName,
int stage,
Func<CancellationToken, Task> onStart,
Func<CancellationToken, Task> onStop);
IDisposable Subscribe(
this ILifecycleObservable observable,
string observerName,
int stage,
Func<CancellationToken, Task> onStart);
類似的擴充函式允許泛型型別引數用來取代觀察者名稱。
IDisposable Subscribe<TObserver>(
this ILifecycleObservable observable,
int stage,
Func<CancellationToken, Task> onStart,
Func<CancellationToken, Task> onStop);
IDisposable Subscribe<TObserver>(
this ILifecycleObservable observable,
int stage,
Func<CancellationToken, Task> onStart);
生命週期參與
某些擴充點需要一種方式來辨別哪些元件有興趣參與生命週期。 已針對此目的引進生命週期參與者標記介面。 探索定址定址接收器和粒紋生命週期時,將詳細說明如何使用此功能。
public interface ILifecycleParticipant<TLifecycleObservable>
where TLifecycleObservable : ILifecycleObservable
{
void Participate(TLifecycleObservable lifecycle);
}
範例
從我們的生命週期測試中,以下是元件在生命週期的多個階段參與可觀察生命週期的範例。
enum TestStages
{
Down,
Initialize,
Configure,
Run,
};
class MultiStageObserver : ILifecycleParticipant<ILifecycleObservable>
{
public Dictionary<TestStages,bool> Started { get; } = new();
public Dictionary<TestStages, bool> Stopped { get; } = new();
private Task OnStartStage(TestStages stage)
{
Started[stage] = true;
return Task.CompletedTask;
}
private Task OnStopStage(TestStages stage)
{
Stopped[stage] = true;
return Task.CompletedTask;
}
public void Participate(ILifecycleObservable lifecycle)
{
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Down,
_ => OnStartStage(TestStages.Down),
_ => OnStopStage(TestStages.Down));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Initialize,
_ => OnStartStage(TestStages.Initialize),
_ => OnStopStage(TestStages.Initialize));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Configure,
_ => OnStartStage(TestStages.Configure),
_ => OnStopStage(TestStages.Configure));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Run,
_ => OnStartStage(TestStages.Run),
_ => OnStopStage(TestStages.Run));
}
}