Delen via


Orleans levenscyclusoverzicht

Sommige Orleans gedragingen zijn zo complex dat ze een geordende opstart en afsluiting vereisen. Onderdelen met dergelijk gedrag omvatten korrels, silo's en klanten. Orleans Hiervoor is een algemeen levenscycluspatroon voor onderdelen geïntroduceerd. Dit patroon bestaat uit een waarneembare levenscyclus, verantwoordelijk voor het signaleren van fasen van het opstarten en afsluiten van een onderdeel, en waarnemers van de levenscyclus, die verantwoordelijk zijn voor het uitvoeren van opstart- of afsluitbewerkingen in specifieke fasen.

Zie De levenscyclus en silolevenscyclus van Grain voor meer informatie.

Waarneembare levenscyclus

Onderdelen die geordende opstarten en afsluiten nodig hebben, kunnen een waarneembare levenscyclus gebruiken. Hierdoor kunnen andere onderdelen de levenscyclus observeren en meldingen ontvangen wanneer een specifieke fase wordt bereikt tijdens het opstarten of afsluiten.

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

De aanroep Abonneren registreert een waarnemer voor meldingen wanneer een fase wordt bereikt tijdens het opstarten of afsluiten. De naam van de waarnemer wordt gebruikt voor rapportagedoeleinden. De fase geeft aan op welk punt in de opstart-/afsluitvolgorde de waarnemer een melding ontvangt. Elke levenscyclusfase is waarneembaar. Alle waarnemers worden op de hoogte gesteld wanneer de fase wordt bereikt tijdens het opstarten en afsluiten. Fasen beginnen in oplopende volgorde en stoppen in aflopende volgorde. De waarnemer kan zich afmelden door het geretourneerde wegwerpobject te verwijderen.

Waarnemer van levenscyclus

Onderdelen die moeten deelnemen aan de levenscyclus van een ander onderdeel, moeten hooks bieden voor hun opstart- en afsluitgedrag en zich abonneren op een specifieke fase van een waarneembare levenscyclus.

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

Zowel ILifecycleObserver.OnStart als ILifecycleObserver.OnStop worden aangeroepen wanneer de geabonneerde fase wordt bereikt tijdens het opstarten of afsluiten.

Nutsvoorzieningen

Voor het gemak bestaan helperfuncties voor veelvoorkomende levenscyclusgebruikspatronen.

Uitbreidingen

Extensiefuncties zijn beschikbaar voor abonneren op een waarneembare levenscyclus waarvoor het abonnementsonderdeel niet hoeft te worden geïmplementeerd ILifecycleObserver. In plaats daarvan kunnen onderdelen lambdas- of lidfuncties doorgeven die in de geabonneerde fasen worden aangeroepen.

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

Vergelijkbare extensiefuncties maken het gebruik van algemene typeargumenten mogelijk in plaats van de naam van de waarnemer.

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

Deelname aan levenscyclus

Sommige uitbreidbaarheidspunten hebben een manier nodig om te herkennen welke onderdelen geïnteresseerd zijn in deelname aan een levenscyclus. Een interface voor de markering van de levenscyclus van deelnemers dient dit doel. Meer informatie over het gebruik ervan wordt behandeld bij het verkennen van silo- en graanlevenscycli.

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

Voorbeeld

In de Orleans levenscyclustests hieronder ziet u een voorbeeld van een onderdeel dat deelneemt aan een waarneembare levenscyclus in meerdere fasen.

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