Szemcsés életciklus áttekintése

Orleans a szemcsék megfigyelhető életciklust (lásd Orleans : életciklus) használnak a rendezett aktiváláshoz és deaktiváláshoz. Ez lehetővé teszi a szemcsés logika, a rendszerösszetevők és az alkalmazáslogika rendezett elindítását és leállítását a gabona aktiválása és gyűjtése során.

Szakaszok

Az előre definiált szemcsés életciklus-szakaszok a következők.

public static class GrainLifecycleStage
{
    public const int First = int.MinValue;
    public const int SetupState = 1_000;
    public const int Activate = 2_000;
    public const int Last = int.MaxValue;
}

Míg a szemcse életciklusa a szemcse aktiválása során lesz használatban, mivel a szemcsék bizonyos hibaesetekben (például siló összeomlások) nem mindig inaktiválódnak, az alkalmazások nem támaszkodhatnak arra, hogy a gabona életciklusa mindig végrehajtásra kerül a szemcse-inaktiválások során.

A gabona életciklusának részvétele

Az alkalmazáslogika kétféleképpen vehet részt egy szemcse életciklusában:

  • A gabona részt vehet az életciklusában.
  • Az összetevők a szemcseaktiválási környezeten keresztül férhetnek hozzá az életciklushoz (lásd IGrainContext.ObservableLifecycle: ).

A szemcsék mindig részt vesznek az életciklusában, így az alkalmazáslogika a részvételi módszer felülírásával vezethető be.

Példa részvételre

public override void Participate(IGrainLifecycle lifecycle)
{
    base.Participate(lifecycle);
    lifecycle.Subscribe(
        this.GetType().FullName,
        GrainLifecycleStage.SetupState,
        OnSetupState);
}

A fenti példában felülbírálja azt a metódust, Grain<TGrainState> amely az életciklus szakaszában meghívja a GrainLifecycleStage.SetupState metódustOnSetupState.Grain.Participate

A szemcsék felépítése során létrehozott összetevők speciális szemcselogikák hozzáadása nélkül is részt vehetnek az életciklusban. Mivel a gabona környezete (IGrainContextbeleértve a gabona életciklusát isIGrainContext.ObservableLifecycle) a gabona létrehozása előtt jön létre, a tároló által a gabonabe injektált bármely összetevő részt vehet a gabona életciklusában.

A szemcsék felépítése során létrehozott összetevők speciális szemcselogikák hozzáadása nélkül is részt vehetnek az életciklusban. Mivel a gabona aktiválási környezete (IGrainActivationContextbeleértve a gabona életciklusát isIGrainActivationContext.ObservableLifecycle) a gabona létrehozása előtt jön létre, a tároló által a gabonaba injektált bármely összetevő részt vehet a gabona életciklusában.

Példa részvételre, létrehozásra és aktiválásra

A következő összetevő részt vesz a gabona életciklusában, amikor a gyári függvény Create(...)használatával jön létre. Ez a logika létezhet az összetevő konstruktorában, de ez azt kockáztatja, hogy az összetevő a teljes felépítése előtt hozzáadódik az életciklushoz, ami nem biztos, hogy biztonságos.

public class MyComponent : ILifecycleParticipant<IGrainLifecycle>
{
    public static MyComponent Create(IGrainContext context)
    {
        var component = new MyComponent();
        component.Participate(context.ObservableLifecycle);
        return component;
    }

    public void Participate(IGrainLifecycle lifecycle)
    {
        lifecycle.Subscribe<MyComponent>(GrainLifecycleStage.Activate, OnActivate);
    }

    private Task OnActivate(CancellationToken ct)
    {
        // Do stuff
    }
}
public class MyComponent : ILifecycleParticipant<IGrainLifecycle>
{
    public static MyComponent Create(IGrainActivationContext context)
    {
        var component = new MyComponent();
        component.Participate(context.ObservableLifecycle);
        return component;
    }

    public void Participate(IGrainLifecycle lifecycle)
    {
        lifecycle.Subscribe<MyComponent>(GrainLifecycleStage.Activate, OnActivate);
    }

    private Task OnActivate(CancellationToken ct)
    {
        // Do stuff
    }
}

Ha a példaösszetevőt a szolgáltatástárolóban a gyári funkciójával regisztrálja Create(...) , az összetevővel függőségként létrehozott összes szemcse a szemcse speciális logikája nélkül vesz részt az életciklusában.

Összetevő regisztrálása a tárolóban

services.AddTransient<MyComponent>(sp =>
    MyComponent.Create(sp.GetRequiredService<IGrainContext>());
services.AddTransient<MyComponent>(sp =>
    MyComponent.Create(sp.GetRequiredService<IGrainActivationContext>());

Szemcse az összetevővel függőségként

public class MyGrain : Grain, IMyGrain
{
    private readonly MyComponent _component;

    public MyGrain(MyComponent component)
    {
        _component = component;
    }
}