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.OnStartILifecycleObserver.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));
    }
}