Delen via


Overzicht van de levenscyclus van Grain

Orleans korrels gebruiken een waarneembare levenscyclus (Zie Orleans levenscyclus) voor geordende activering en deactivering. Hierdoor kunnen graanlogica, systeemonderdelen en toepassingslogica op een geordende manier worden gestart en gestopt tijdens het activeren en verzamelen van graan.

FASEN

De vooraf gedefinieerde fasen van de levenscyclus van korrels zijn als volgt.

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

Hoewel de levenscyclus van korrels wordt gebruikt tijdens de activering van korrels, omdat korrels niet altijd worden gedeactiveerd tijdens sommige foutgevallen (zoals silocrashes), moeten toepassingen niet afhankelijk zijn van de levenscyclus van graan die altijd wordt uitgevoerd tijdens graandeactivaties.

Deelname aan de levenscyclus van graan

Toepassingslogica kan op twee manieren deelnemen aan de levenscyclus van een graan:

  • Het graan kan deelnemen aan de levenscyclus.
  • Onderdelen hebben toegang tot de levenscyclus via de context van de korrelactivering (zie IGrainContext.ObservableLifecycle).

Een grain neemt altijd deel aan de levenscyclus, zodat toepassingslogica kan worden geïntroduceerd door de methode voor deelname te overschrijven.

Voorbeeld van deelname

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

In het bovenstaande voorbeeld Grain<TGrainState> overschrijft u de methode om de Grain.Participate levenscyclus ervan aan te roepen OnSetupState tijdens de GrainLifecycleStage.SetupState fase van de levenscyclus.

Onderdelen die tijdens de constructie van een graan zijn gemaakt, kunnen ook deelnemen aan de levenscyclus, zonder toevoeging van speciale graanlogica. Aangezien de context van het graan (IGrainContextinclusief de levenscyclusIGrainContext.ObservableLifecycle van het graan) wordt gemaakt voordat het graan wordt gemaakt, kan elk onderdeel dat door de container in het graan wordt geïnjecteerd, deelnemen aan de levenscyclus van het graan.

Onderdelen die tijdens de constructie van een graan zijn gemaakt, kunnen ook deelnemen aan de levenscyclus, zonder toevoeging van speciale graanlogica. Aangezien de activeringscontext van het graan (IGrainActivationContextinclusief de levenscyclusIGrainActivationContext.ObservableLifecycle van het graan) wordt gemaakt voordat het graan wordt gemaakt, kan elk onderdeel dat door de container wordt geïnjecteerd, deelnemen aan de levenscyclus van het graan.

Voorbeeld van deelname, maken en activeren

Het volgende onderdeel neemt deel aan de levenscyclus van het graan bij het maken met behulp van de fabrieksfunctie Create(...). Deze logica kan bestaan in de constructor van het onderdeel, maar dat riskeert dat het onderdeel wordt toegevoegd aan de levenscyclus voordat het volledig is gebouwd, wat mogelijk niet veilig is.

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

Door het voorbeeldonderdeel in de servicecontainer te registreren met behulp van Create(...) de fabrieksfunctie, zal elk graan dat met het onderdeel is gebouwd als een afhankelijkheid, het onderdeel in de levenscyclus van het onderdeel zonder speciale logica in het graan laten deelnemen.

Onderdeel registreren in container

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

Graan met onderdeel als een afhankelijkheid

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

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