Aracılığıyla paylaş


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

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. ).

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