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

Bazı Orleans davranışlar, sıralı başlatma ve kapatma gerektiren yeterince karmaşıktır. Bu tür davranışlara sahip bileşenler arasında tanecikler, silolar ve istemciler bulunur. Bu sorunun çözümüne yönelik olarak, Orleans genel bir bileşen yaşam döngüsü deseni kullanıma sunmuştur. Bu düzen, bir bileşenin başlangıç ve kapatma aşamalarının sinyalleme aşamalarından sorumlu gözlemlenebilir bir yaşam döngüsünden ve belirli aşamalarda başlatma veya kapatma işlemlerinin gerçekleştirilmesinden 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 gereksinimi olan bileşenler gözlemlenebilir bir yaşam döngüsü kullanabilir. Bu, diğer bileşenlerin başlatma veya kapatma sırasında belirli bir aşamaya ulaşıldığında yaşam döngüsünü gözlemlemesini ve bildirim almasını sağlar.

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

Abone ol çağrısı, başlatma veya kapatma sırasında bir aşamaya ulaşıldığında bildirim için bir gözlemci kaydeder. Gözlemcinin adı raporlama amacıyla kullanılır. Aşama, gözlemcinin başlangıç/kapatma sırasında hangi noktada bildirim aldığını gösterir. Her yaşam döngüsü aşaması gözlemlenebilir. Başlatma ve kapatma sırasında aşamaya ulaşıldığında tüm gözlemcilere bildirilir. Aşamalar artan düzende başlar ve azalan sırada durur. Gözlemci, iade edilen tek kullanımlık nesne üzerinden aboneliği kaldırabilir.

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

Başka bir bileşenin yaşam döngüsüne katılması gereken bileşenler, başlatma ve kapatma davranışları için kancalar sağlamalı ve gözlemlenebilir bir yaşam döngüsünün belirli bir aşamasına abone olmalıdır.

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

Hem ILifecycleObserver.OnStart hem de ILifecycleObserver.OnStop, başlatma veya kapatma sırasında abone olunan aşamaya ulaşıldığında çağrılır.

Hizmetler

Kolaylık sağlamak için ortak yaşam döngüsü kullanım desenleri için yardımcı işlevler mevcuttur.

Uzantılar

Uzantı işlevleri, abone olan bileşenin uygulamasını ILifecycleObservergerektirmeyen gözlemlenebilir bir yaşam döngüsüne abone olmak için kullanılabilir. Bunun yerine, bunlar bileşenlerin abone olunan aşamalarda çağrılmak üzere lambda veya üye işlevleri 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şkenlerin kullanılmasına izin verir.

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ımak için bir yönteme ihtiyaç duyar. Yaşam döngüsü katılımcısı işaretçi arabirimi bu amaca hizmet eder. Silo ve tahıl yaşam döngüleri incelenirken kullanımıyla ilgili daha fazla ayrıntıya yer verilmektedir.

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

Örnek

Yaşam döngüsü testlerinden Orleans aşağıda, birden çok aşamada gözlemlenebilir bir yaşam döngüsüne katılan 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));
    }
}