Bagikan melalui


Orleans gambaran umum siklus hidup

Beberapa Orleans perilaku cukup kompleks sehingga membutuhkan startup dan shutdown yang diurutkan. Beberapa komponen dengan perilaku tersebut termasuk biji-bijian, silo, dan klien. Untuk mengatasi hal ini, pola siklus hidup komponen umum telah diperkenalkan. Pola ini terdiri dari siklus hidup yang dapat diamati, yang bertanggung jawab untuk memberi sinyal pada tahap startup dan shutdown komponen, dan pengamat siklus hidup yang bertanggung jawab untuk melakukan operasi startup atau shutdown pada tahap tertentu.

Untuk informasi selengkapnya, lihat Siklus hidup Grain dan siklus hidup Silo.

Siklus hidup yang dapat diamati

Komponen yang membutuhkan startup dan shutdown yang diurutkan dapat menggunakan siklus hidup yang dapat diamati yang memungkinkan komponen lain untuk mengamati siklus hidup dan menerima pemberitahuan ketika tahap tercapai selama startup atau shutdown.

public interface ILifecycleObservable
{
    IDisposable Subscribe(
        string observerName,
        int stage,
        ILifecycleObserver observer);
}

Panggilan berlangganan mendaftarkan pengamat untuk pemberitahuan ketika tahap tercapai saat memulai atau berhenti. Nama pengamat adalah untuk tujuan pelaporan. Tahap yang ditunjukkan pada titik mana dalam urutan startup/shutdown pengamat akan diberi tahu. Setiap tahap siklus hidup dapat diamati. Semua pengamat akan diberi tahu ketika tahapan tercapai saat dimulai dan dihentikan. Tahapan dimulai dalam urutan naik dan dihentikan dalam urutan turun. Pengamat dapat berhenti berlangganan dengan membuang sekali pakai yang dikembalikan.

Pengamat siklus hidup

Komponen yang perlu mengambil bagian dalam siklus hidup komponen lain perlu menyediakan kait untuk perilaku startup dan shutdown mereka dan berlangganan ke tahap tertentu dari siklus hidup yang dapat diamati.

public interface ILifecycleObserver
{
    Task OnStart(CancellationToken ct);
    Task OnStop(CancellationToken ct);
}

Keduanya ILifecycleObserver.OnStart dan ILifecycleObserver.OnStop dipanggil ketika tahap berlangganan tercapai selama startup/shutdown.

Utilitas

Untuk kenyamanan, fungsi pembantu telah dibuat untuk pola penggunaan siklus hidup umum.

Ekstensi

Fungsi ekstensi ada untuk berlangganan siklus hidup yang dapat diamati yang tidak mengharuskan komponen berlangganan mengimplementasikan ILifecycleObserver. Sebaliknya, ini memungkinkan komponen untuk meneruskan fungsi lambda atau anggota untuk dipanggil pada tahap berlangganan.

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);

Fungsi ekstensi serupa memungkinkan argumen jenis generik digunakan sebagai pengganti nama pengamat.

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);

Partisipasi siklus hidup

Beberapa poin ekstensibilitas membutuhkan cara untuk mengenali komponen apa yang tertarik untuk berpartisipasi dalam siklus hidup. Antarmuka penanda peserta siklus hidup telah diperkenalkan untuk tujuan ini. Lebih lanjut tentang bagaimana ini digunakan akan ditutupi saat menjelajahi silo dan siklus hidup biji-bijian.

public interface ILifecycleParticipant<TLifecycleObservable>
    where TLifecycleObservable : ILifecycleObservable
{
    void Participate(TLifecycleObservable lifecycle);
}

Contoh

Dari pengujian siklus hidup kami, di bawah ini adalah contoh komponen yang mengambil bagian dalam siklus hidup yang dapat diamati pada beberapa tahap siklus hidup.

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