Dela via


Översikt över kornlivscykel

Orleans korn använder en observerbar livscykel (se Orleans Livscykel) för ordnad aktivering och inaktivering. På så sätt kan kornlogik, systemkomponenter och programlogik startas och stoppas på ett ordnat sätt under kornaktivering och insamling.

STADIER

De fördefinierade livscykelstegen för korn är följande.

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

Medan kornlivscykeln kommer att användas under kornaktivering, eftersom korn inte alltid inaktiveras under vissa felfall (till exempel silokrascher), bör program inte förlita sig på att kornlivscykeln alltid körs under kornaktivering.

Deltagande i kornlivscykel

Programlogik kan delta med ett korns livscykel på två sätt:

Ett korn ingår alltid i dess livscykel, så programlogik kan introduceras genom att åsidosätta deltametoden.

Exempel på deltagande

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

I exemplet ovan Grain<TGrainState> åsidosätter Grain.Participate metoden för att instruera livscykeln att anropa dess OnSetupState metod under GrainLifecycleStage.SetupState livscykelns fas.

Komponenter som skapas under en kornkonstruktion kan också delta i livscykeln, utan att lägga till någon särskild kornlogik. Eftersom kornets kontext (IGrainContext), inklusive kornets livscykel (IGrainContext.ObservableLifecycle), skapas innan kornet skapas, kan alla komponenter som matas in i kornet av containern delta i kornets livscykel.

Komponenter som skapas under en kornkonstruktion kan också delta i livscykeln, utan att lägga till någon särskild kornlogik. Eftersom kornets aktiveringskontext (IGrainActivationContext), inklusive kornets livscykel (IGrainActivationContext.ObservableLifecycle), skapas innan kornet skapas, kan alla komponenter som matas in i kornet av containern delta i kornets livscykel.

Exempel på deltagande, skapande och aktivering

Följande komponent deltar i kornets livscykel när den skapas med hjälp av fabriksfunktionen Create(...). Den här logiken kan finnas i komponentens konstruktor, men det riskerar att komponenten läggs till i livscykeln innan den är helt konstruerad, vilket kanske inte är säkert.

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

Genom att registrera exempelkomponenten i tjänstcontainern med hjälp av dess Create(...) fabriksfunktion kommer alla korn som konstruerats med komponenten som ett beroende att få komponenten att delta i dess livscykel utan någon särskild logik i kornigheten.

Registrera komponent i container

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

Korn med komponenten som ett beroende

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

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