Gambaran umum siklus hidup biji-bijian
Orleans biji-bijian menggunakan siklus hidup yang dapat diamati (Lihat Orleans Siklus Hidup) untuk aktivasi dan pennonaktifkan yang diurutkan. Ini memungkinkan logika biji-bijian, komponen sistem, dan logika aplikasi dimulai dan dihentikan secara berurutan selama aktivasi dan pengumpulan biji-bijian.
Tahap
Tahap siklus hidup biji-bijian yang telah ditentukan sebelumnya adalah sebagai berikut.
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
: Tahap pertama dalam siklus hidup biji-bijian.SetupState
: Siapkan status biji-bijian, sebelum aktivasi. Untuk butiran stateful, ini adalah tahap di mana IStorage<TState>.State dimuat dari penyimpanan, kapan IStorage.RecordExists adalahtrue
.Activate
: Tahap di mana Grain.OnActivateAsync dan Grain.OnDeactivateAsync dipanggil.Last
: Tahap terakhir dalam siklus hidup biji-bijian.
Sementara siklus hidup biji-bijian akan digunakan selama aktivasi biji-bijian, karena biji-bijian tidak selalu dinonaktifkan selama beberapa kasus kesalahan (seperti crash silo), aplikasi tidak boleh bergantung pada siklus hidup biji-bijian yang selalu dijalankan selama penonaktifan biji-bijian.
Partisipasi siklus hidup biji-bijian
Logika aplikasi dapat berpartisipasi dengan siklus hidup biji-bijian dengan dua cara:
- Biji-bijian dapat berpartisipasi dalam siklus hidupnya.
- Komponen dapat mengakses siklus hidup melalui konteks aktivasi biji-bijian (lihat IGrainContext.ObservableLifecycle).
- Biji-bijian dapat berpartisipasi dalam siklus hidupnya.
- Komponen dapat mengakses siklus hidup melalui konteks aktivasi biji-bijian (lihat IGrainActivationContext.ObservableLifecycle).
Biji-bijian selalu berpartisipasi dalam siklus hidupnya, sehingga logika aplikasi dapat diperkenalkan dengan mengambil alih metode yang berpartisipasi.
Contoh partisipasi
public override void Participate(IGrainLifecycle lifecycle)
{
base.Participate(lifecycle);
lifecycle.Subscribe(
this.GetType().FullName,
GrainLifecycleStage.SetupState,
OnSetupState);
}
Dalam contoh di atas, Grain<TGrainState> ambil alih Grain.Participate metode untuk memberi tahu siklus hidup untuk memanggil metodenya OnSetupState
selama GrainLifecycleStage.SetupState tahap siklus hidup.
Komponen yang dibuat selama konstruksi biji-bijian juga dapat mengambil bagian dalam siklus hidup, tanpa penambahan logika biji-bijian khusus. Karena konteks biji-bijian (IGrainContext), termasuk siklus hidup biji-bijian (IGrainContext.ObservableLifecycle), dibuat sebelum biji-bijian dibuat, komponen apa pun yang disuntikkan ke dalam biji-bijian oleh kontainer dapat berpartisipasi dalam siklus hidup biji-bijian.
Komponen yang dibuat selama konstruksi biji-bijian juga dapat mengambil bagian dalam siklus hidup, tanpa penambahan logika biji-bijian khusus. Karena konteks aktivasi biji-bijian (IGrainActivationContext), termasuk siklus hidup biji-bijian (IGrainActivationContext.ObservableLifecycle), dibuat sebelum biji-bijian dibuat, komponen apa pun yang disuntikkan ke dalam biji-bijian oleh kontainer dapat berpartisipasi dalam siklus hidup biji-bijian.
Contoh partisipasi, pembuatan, dan aktivasi
Komponen berikut berpartisipasi dalam siklus hidup biji-bijian saat dibuat menggunakan fungsi Create(...)
pabriknya . Logika ini bisa ada di konstruktor komponen, tetapi itu berisiko komponen ditambahkan ke siklus hidup sebelum sepenuhnya dibangun, yang mungkin tidak aman.
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
}
}
Dengan mendaftarkan komponen contoh dalam kontainer layanan menggunakan fungsi pabriknya Create(...)
, biji-bijian apa pun yang dibangun dengan komponen sebagai dependensi akan memiliki komponen yang mengambil bagian dalam siklus hidupnya tanpa logika khusus dalam biji-bijian.
Mendaftarkan komponen dalam kontainer
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainContext>());
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainActivationContext>());
Butir dengan komponen sebagai dependensi
public class MyGrain : Grain, IMyGrain
{
private readonly MyComponent _component;
public MyGrain(MyComponent component)
{
_component = component;
}
}