Tahıl yaşam döngüsüne genel bakış
Orleans tahıllar, sıralı etkinleştirme ve devre dışı bırakma için gözlemlenebilir bir yaşam döngüsü kullanır (Bkz Orleans . Yaşam Döngüsü). Bu, tahıl mantığının, sistem bileşenlerinin ve uygulama mantığının, tahıl etkinleştirme ve toplama sırasında sıralı bir şekilde başlatılmasını ve durdurulmasını sağlar.
AŞAMALAR
Önceden tanımlanmış tahıl yaşam döngüsü aşamaları aşağıdaki gibidir.
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
: Bir tahıl yaşam döngüsünün ilk aşaması.SetupState
: Etkinleştirmeden önce tahıl durumunu ayarlayın. Durum bilgisi olan tanecikler için bu, olduğunda depolama IStorage.RecordExists alanından yüklenen aşamadır.IStorage<TState>.Statetrue
Activate
: ve çağrıldığı aşama Grain.OnActivateAsync Grain.OnDeactivateAsync .Last
: Bir tahıl yaşam döngüsünün son aşaması.
Tahıl etkinleştirme sırasında tahıl yaşam döngüsü kullanılacak olsa da, bazı hata durumlarında (silo kilitlenmeleri gibi) tahıllar her zaman devre dışı bırakılmadığından, uygulamalar tahıl devre dışı bırakma sırasında her zaman yürütülen tahıl yaşam döngüsüne güvenmemelidir.
Tahıl yaşam döngüsü katılımı
Uygulama mantığı, bir dilimin yaşam döngüsüne iki şekilde katılabilir:
- Tahıl yaşam döngüsüne katılabilir.
- Bileşenler, tahıl etkinleştirme bağlamı aracılığıyla yaşam döngüsüne erişebilir (bkz IGrainContext.ObservableLifecycle. ).
- Tahıl yaşam döngüsüne katılabilir.
- Bileşenler, tahıl etkinleştirme bağlamı aracılığıyla yaşam döngüsüne erişebilir (bkz IGrainActivationContext.ObservableLifecycle. ).
Bir tahıl her zaman yaşam döngüsüne katılır, bu nedenle katılım yöntemi geçersiz kılınarak uygulama mantığı tanıtılabilir.
Örnek katılım
public override void Participate(IGrainLifecycle lifecycle)
{
base.Participate(lifecycle);
lifecycle.Subscribe(
this.GetType().FullName,
GrainLifecycleStage.SetupState,
OnSetupState);
}
Yukarıdaki örnekte, Grain<TGrainState> yaşam döngüsünün Grain.Participate aşamasında yöntemini çağırmasını OnSetupState
söylemek için yöntemini GrainLifecycleStage.SetupState geçersiz kılar.
Bir tahılın yapımı sırasında oluşturulan bileşenler, özel bir tane mantığı eklenmeden yaşam döngüsünde de yer alabilir. Tahılın yaşam döngüsüIGrainContext.ObservableLifecycle ( dahil) dilimin bağlamı (IGrainContext ) tane oluşturulmadan önce oluşturulduğundan, kapsayıcı tarafından grene eklenen tüm bileşenler tahılın yaşam döngüsüne katılabilir.
Bir tahılın yapımı sırasında oluşturulan bileşenler, özel bir tane mantığı eklenmeden yaşam döngüsünde de yer alabilir. Tahılın yaşam döngüsüIGrainActivationContext.ObservableLifecycle ( dahil) tahılın etkinleştirme bağlamı (IGrainActivationContext ) tane oluşturulmadan önce oluşturulduğundan, kapsayıcı tarafından grene eklenen tüm bileşenler tahılın yaşam döngüsüne katılabilir.
Örnek katılım, oluşturma ve etkinleştirme
Aşağıdaki bileşen, fabrika işlevi Create(...)
kullanılarak oluşturulduğunda tahılın yaşam döngüsüne katılır. Bu mantık bileşenin oluşturucusunda bulunabilir, ancak bu, bileşenin tam olarak oluşturulmadan önce yaşam döngüsüne eklenmesini riske atabilir ve bu da güvenli olmayabilir.
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
}
}
Örnek bileşeni fabrika işlevini kullanarak hizmet kapsayıcısına Create(...)
kaydederek, bileşenle bağımlılık olarak inşa edilen herhangi bir tanecik, tahılda herhangi bir özel mantık olmadan bileşenin yaşam döngüsünde yer almasına neden olur.
Bileşeni kapsayıcıya kaydetme
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainContext>());
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainActivationContext>());
Bağımlılık olarak bileşen içeren tanecik
public class MyGrain : Grain, IMyGrain
{
private readonly MyComponent _component;
public MyGrain(MyComponent component)
{
_component = component;
}
}