Delen via


Orleans levenscyclusoverzicht

Sommige Orleans gedragingen zijn voldoende complex dat ze besteld opstarten en afsluiten nodig hebben. Sommige onderdelen met dergelijk gedrag omvatten korrels, silo's en clients. Om dit aan te pakken, is er een algemeen levenscycluspatroon voor onderdelen geïntroduceerd. Dit patroon bestaat uit een waarneembare levenscyclus, die verantwoordelijk is 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 opstart- en afsluitfase nodig hebben, kunnen een waarneembare levenscyclus gebruiken, zodat andere onderdelen de levenscyclus kunnen observeren en een melding ontvangen wanneer een fase wordt bereikt tijdens het opstarten of afsluiten.

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

De abonneeaanroep registreert een waarnemer voor meldingen wanneer een fase wordt bereikt tijdens het starten of stoppen. De naam van de waarnemer is bedoeld voor rapportagedoeleinden. De fase die wordt aangegeven op welk punt in de opstart-/afsluitvolgorde de waarnemer op de hoogte wordt gesteld. Elke fase van de levenscyclus kan worden waargenomen. Alle waarnemers worden op de hoogte gesteld wanneer de fase wordt bereikt bij het starten en stoppen. Fasen worden gestart in oplopende volgorde en gestopt in aflopende volgorde. De waarnemer kan zich afmelden door het geretourneerde wegwerp weg te verwijderen.

Waarnemer van levenscyclus

Onderdelen die aan de levenscyclus van een ander onderdeel moeten deelnemen, 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);
}

Beide ILifecycleObserver.OnStart worden ILifecycleObserver.OnStop aangeroepen wanneer de fase waarop u zich hebt geabonneerd, wordt bereikt tijdens het opstarten/afsluiten.

Hulpprogramma's

Voor het gemak zijn helperfuncties gemaakt voor algemene gebruikspatronen voor de levenscyclus.

Uitbreidingen

Extensiefuncties bestaan voor het abonneren op waarneembare levenscyclus. Hiervoor is niet vereist dat het subscribing-onderdeel ILifecycleObserver implementeert. In plaats daarvan kunnen onderdelen de functie lambdas of leden 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);

Met vergelijkbare extensiefuncties kunnen algemene typeargumenten worden gebruikt 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. Hiervoor is een interface voor de markering van de levenscyclus van deelnemers geïntroduceerd. Meer informatie over hoe dit wordt gebruikt, wordt behandeld bij het verkennen van silo- en graanlevenscycli.

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

Opmerking

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

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