Orleans yaşam döngüsüne genel bakış

Bazı Orleans davranışlar, sıralı başlatma ve kapatmaya ihtiyaç duydukları için yeterince karmaşıktır. Bu tür davranışlara sahip bazı bileşenler arasında tanecikler, silolar ve istemciler bulunur. Bu sorunu çözmek için genel bir bileşen yaşam döngüsü düzeni kullanıma sunulmuştur. Bu düzen, bir bileşenin başlatma ve kapatma aşamalarında sinyal sağlamaktan sorumlu olan gözlemlenebilir bir yaşam döngüsünden ve belirli aşamalarda başlatma veya kapatma işlemlerini gerçekleştirmekle sorumlu yaşam döngüsü gözlemcilerinden oluşur.

Daha fazla bilgi için bkz . Tahıl yaşam döngüsü ve Silo yaşam döngüsü.

Gözlemlenebilir yaşam döngüsü

Sıralı başlatma ve kapatma gerektiren bileşenler, diğer bileşenlerin yaşam döngüsünü gözlemlemesini ve başlatma veya kapatma sırasında bir aşamaya ulaşıldığında bildirim almasını sağlayan gözlemlenebilir bir yaşam döngüsü kullanabilir.

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

Abone olma çağrısı, başlatılırken veya durdurulduğunda bir aşamaya ulaşıldığında bildirim için bir gözlemci kaydeder. Gözlemcinin adı raporlama amaçlıdır. Başlangıç/kapatma sırasında gözlemciye hangi noktada bildirim alınacağını gösteren aşama. Yaşam döngüsünün her aşaması gözlemlenebilir. Başlangıç ve durdurma sırasında aşamaya ulaşıldığında tüm gözlemcilere bildirilir. Aşamalar artan düzende başlatılır ve azalan sırada durdurulur. Gözlemci, döndürülen tek kullanımlık değeri atarak aboneliği kaldırabilir.

Yaşam döngüsü gözlemcisi

Başka bir bileşenin yaşam döngüsünde yer alması gereken bileşenlerin başlatma ve kapatma davranışları için kancalar sağlaması ve gözlemlenebilir bir yaşam döngüsünün belirli bir aşamasına abone olması gerekir.

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

ILifecycleObserver.OnStop Başlatma/kapatma sırasında abone olunan aşamaya ulaşıldığında hem hem de ILifecycleObserver.OnStart çağrılır.

Yardımcı Programlar

Kolaylık sağlamak amacıyla, ortak yaşam döngüsü kullanım desenleri için yardımcı işlevler oluşturulmuştur.

Uzantıları

Abone olan bileşenin ILifecycleObserver uygulamasını gerektirmeyen gözlemlenebilir yaşam döngüsüne abone olmak için uzantı işlevleri vardır. Bunun yerine, bunlar bileşenlerin abone olunan aşamalarda çağrılmak üzere lambdalar veya üyeler işlevi geçirmesine izin verir.

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

Benzer uzantı işlevleri, gözlemci adı yerine genel tür bağımsız değişkenlerinin kullanılmasına olanak sağlar.

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

Yaşam döngüsü katılımı

Bazı genişletilebilirlik noktaları, bir yaşam döngüsüne katılmak isteyen bileşenleri tanımanın bir yoluna ihtiyaç duyar. Bu amaçla bir yaşam döngüsü katılımcısı işaretçi arabirimi kullanıma sunulmuştur. Bunun nasıl kullanıldığı hakkında daha fazla bilgi silo ve tahıl yaşam döngüleri keşfedilirken ele alınacaktır.

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

Örnek

Yaşam döngüsü testlerimizden aşağıda, yaşam döngüsünün birden çok aşamasında gözlemlenebilir bir yaşam döngüsünde yer alan bir bileşen örneği verilmiştir.

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