Bagikan melalui


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

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