Dela via


Korntillägg

Korntillägg är ett sätt att lägga till extra beteende i korn. Genom att utöka ett korn med ett gränssnitt som härleds från IGrainExtensionkan du lägga till nya metoder och funktioner i kornet.

I den här artikeln visas två exempel på korntillägg. Det första exemplet visar hur du lägger till en Deactivate metod i alla korn som kan användas för att inaktivera kornet. Det andra exemplet visar hur du lägger till en GetState och-metod SetState i alla korn, så att du kan ändra kornets interna tillstånd.

Inaktivera tilläggsexempel

I det här exemplet får du lära dig hur du lägger till en Deactivate metod i alla korn automatiskt. Metoden kan användas för att inaktivera kornet och accepterar en sträng som en meddelandeparameter. Orleans korn stöder redan den här funktionen via IGrainManagementExtension gränssnittet. Det här exemplet visar dock hur du kan lägga till den här eller liknande funktionen själv.

Inaktivera tilläggsgränssnittet

Börja med att definiera ett IGrainDeactivateExtension gränssnitt som innehåller Deactivate metoden. Gränssnittet måste härledas från IGrainExtension.

public interface IGrainDeactivateExtension : IGrainExtension
{
    Task Deactivate(string msg);
}

Inaktivera tilläggsimplementering

Implementera sedan GrainDeactivateExtension klassen, som tillhandahåller implementeringen för Deactivate metoden.

För att komma åt målintervallet hämtar IGrainContext du från konstruktorn. Det matas in när du skapar tillägget med beroendeinmatning.

public sealed class GrainDeactivateExtension : IGrainDeactivateExtension
{
    private IGrainContext _context;

    public GrainDeactivateExtension(IGrainContext context)
    {
        _context = context;
    }

    public Task Deactivate(string msg)
    {
        var reason = new DeactivationReason(DeactivationReasonCode.ApplicationRequested, msg);
        _context.Deactivate(reason);
        return Task.CompletedTask;
    }
}

Inaktivera tilläggsregistrering och användning

Nu när du har definierat gränssnittet och implementeringen registrerar du tillägget när du konfigurerar silon med AddGrainExtension -metoden.

siloBuilder.AddGrainExtension<IGrainDeactivateExtension, GrainDeactivateExtension>();

Om du vill använda tillägget på valfri kornighet hämtar du en referens till tillägget och anropar Deactivate metoden.

var grain = client.GetGrain<SomeExampleGrain>(someKey);
var grainReferenceAsInterface = grain.AsReference<IGrainDeactivateExtension>();

await grainReferenceAsInterface.Deactivate("Because, I said so...");

Exempel på tillståndsmanipuleringstillägg

I det här exemplet får du lära dig hur du lägger till en GetState och-metod SetState i alla korn genom tillägg, så att du kan ändra kornets interna tillstånd.

Gränssnitt för tillståndsmanipuleringstillägg

Definiera först gränssnittet IGrainStateAccessor<T> , som innehåller GetState metoderna och SetState . Återigen måste det här gränssnittet härledas från IGrainExtension.

public interface IGrainStateAccessor<T> : IGrainExtension
{
    Task<T> GetState();
    Task SetState(T state);
}

När du har åtkomst till målintervallet kan du använda tillägget för att ändra dess tillstånd. I det här exemplet använder du ett tillägg för att komma åt och ändra ett specifikt heltalstillståndsvärde inom målintervallet.

Implementering av tillägg för tillståndsmanipulering

Tillägget du använder är IGrainStateAccessor<T>, som innehåller metoder för att hämta och ange ett tillståndsvärde av typen T. För att skapa tillägget implementerar du gränssnittet i en klass som tar en getter och en setter som argument i konstruktorn.

public sealed class GrainStateAccessor<T> : IGrainStateAccessor<T>
{
    private readonly Func<T> _getter;
    private readonly Action<T> _setter;

    public GrainStateAccessor(Func<T> getter, Action<T> setter)
    {
        _getter = getter;
        _setter = setter;
    }

    public Task<T> GetState()
    {
        return Task.FromResult(_getter.Invoke());
    }

    public Task SetState(T state)
    {
        _setter.Invoke(state);
        return Task.CompletedTask;
    }
}

I föregående implementering GrainStateAccessor<T> tar getter klassen och setter argumenten i konstruktorn. Dessa ombud används för att läsa och ändra målkornets tillstånd. Metoden GetState() returnerar ett Task<TResult> omsluter det aktuella värdet för T tillståndet, medan SetState(T state) metoden anger det nya värdet för T tillståndet.

Registrering och användning av tillägg för tillståndsmanipulering

Om du vill använda tillägget för att komma åt och ändra målkornets tillstånd måste du registrera tillägget och ange dess komponenter i Grain.OnActivateAsync() metoden för målintervallet.

public override Task OnActivateAsync()
{
    // Retrieve the IGrainStateAccessor<T> extension
    var accessor = new GrainStateAccessor<int>(
        getter: () => this.Value,
        setter: value => this.Value = value);

    // Set the extension as a component of the target grain's context
    ((IGrainBase)this).GrainContext.SetComponent<IGrainStateAccessor<int>>(accessor);

    return base.OnActivateAsync();
}

I föregående exempel skapar du en ny instans av GrainStateAccessor<int> som tar ett getter och ett setter för ett heltalstillståndsvärde. Läser getter egenskapen för Value målintervallet, medan setter det nya värdet för Value egenskapen anges. du anger sedan den här instansen som en komponent i målintervallets kontext med hjälp av IGrainContext.SetComponent metoden .

När tillägget har registrerats kan du använda det för att hämta och ange målintervallets tillstånd genom att komma åt det via en referens till tillägget.

// Get a reference to the IGrainStateAccessor<int> extension
var accessor = grain.AsReference<IGrainStateAccessor<int>>();

// Get the current value of the state
var value = await accessor.GetState();

// Set a new value of the state
await accessor.SetState(10);

I föregående exempel får du en referens till IGrainStateAccessor<int> tillägget för en specifik korninstans med hjälp av GrainExtensions.AsReference metoden. Du kan sedan använda den här referensen GetState() för att anropa metoderna och SetState(T state) för att läsa och ändra statusvärdet för målintervallet.

Se även