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;
}
First
: A gabona életciklusának első szakasza.SetupState
: A szemcseállapot beállítása aktiválás előtt. Állapotalapú szemcsék esetében ez az a szakasz, ahol IStorage<TState>.State a tárolóból töltődik be, amikor IStorage.RecordExists vantrue
.Activate
: A szakasz neve és Grain.OnDeactivateAsync helyeGrain.OnActivateAsync.Last
: A gabona életciklusának utolsó szakasza.
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 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 IGrainActivationContext.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;
}
}