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.