Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kornerweiterungen bieten eine Möglichkeit, zusätzliches Verhalten zu Getreide hinzuzufügen. Durch die Erweiterung eines Korns mit einer Schnittstelle, die von IGrainExtension abgeleitet ist, können neue Methoden und Funktionen zum Korn hinzugefügt werden.
In diesem Artikel werden zwei Beispiele für Getreideerweiterungen vorgestellt. Das erste Beispiel zeigt, wie Sie allen Körnern eine Deactivate Methode hinzufügen, die zum Deaktivieren des Getreides verwendet werden kann. Im zweiten Beispiel wird gezeigt, wie man einem Grain die Methoden GetState und SetState hinzufügen kann, um den internen Zustand des Grains zu manipulieren.
Erweiterung deaktivieren Beispiel
In diesem Beispiel wird das automatische Hinzufügen einer Deactivate Methode zu allen Körnern veranschaulicht. Verwenden Sie die Methode, um das Getreide zu deaktivieren; sie akzeptiert eine Zeichenfolge als Nachrichtenparameter.
Orleans Körner unterstützen diese Funktionalität bereits über die IGrainManagementExtension Schnittstelle. Dennoch zeigt dieses Beispiel, wie diese oder ähnliche Funktionalität hinzugefügt werden kann.
Deaktivieren der Erweiterungsschnittstelle
Definieren Sie zunächst eine IGrainDeactivateExtension Schnittstelle, die die Deactivate Methode enthält. Die Schnittstelle muss von IGrainExtension abgeleitet werden.
public interface IGrainDeactivateExtension : IGrainExtension
{
Task Deactivate(string msg);
}
Deaktivieren der Erweiterungsimplementierung
Implementieren Sie als Nächstes die GrainDeactivateExtension Klasse, die die Implementierung für die Deactivate Methode bereitstellt.
Um auf das Zielobjekt zuzugreifen, rufen Sie das IGrainContext aus dem Konstruktor ab. Sie wird beim Erstellen der Erweiterung über die Abhängigkeitsinjektion eingefügt.
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;
}
}
Deaktivieren der Erweiterungsregistrierung und -nutzung
Nachdem die Schnittstelle und Implementierung definiert sind, registrieren Sie die Erweiterung beim Konfigurieren des Silos mithilfe der AddGrainExtension Methode.
siloBuilder.AddGrainExtension<IGrainDeactivateExtension, GrainDeactivateExtension>();
Um die Erweiterung für beliebige Grain zu verwenden, holen Sie sich eine Referenz auf die Erweiterung und rufen deren Deactivate-Methode auf.
var grain = client.GetGrain<SomeExampleGrain>(someKey);
var grainReferenceAsInterface = grain.AsReference<IGrainDeactivateExtension>();
await grainReferenceAsInterface.Deactivate("Because, I said so...");
Beispiel für die Zustandsmanipulationserweiterung
Dieses Beispiel zeigt, wie GetState und SetState Methoden durch Erweiterungen zu einem beliebigen Korn hinzugefügt werden können, wodurch die Manipulation des internen Zustands des Korns ermöglicht wird.
Erweiterungsschnittstelle für Zustandsmanipulationen
Definieren Sie zunächst die IGrainStateAccessor<T> Schnittstelle, die die Methoden GetState und SetState enthält. Auch hier muss diese Schnittstelle von IGrainExtension abgeleitet werden.
public interface IGrainStateAccessor<T> : IGrainExtension
{
Task<T> GetState();
Task SetState(T state);
}
Sobald der Zugriff auf das Zielkorn verfügbar ist, verwenden Sie die Erweiterung, um ihren Zustand zu ändern. Verwenden Sie in diesem Beispiel eine Erweiterung, um auf einen bestimmten ganzzahligen Zustandswert innerhalb des Zielkorns zuzugreifen und diesen zu ändern.
Implementierung einer Erweiterung zur Zustandsmanipulation
Die verwendete Erweiterung ist IGrainStateAccessor<T>, die Methoden zum Abrufen und Festlegen eines Zustandswerts vom Typ T bietet. Um die Erweiterung zu erstellen, implementieren Sie die Schnittstelle in einer Klasse, die ein getter und ein setter als Argumente im Konstruktor verwendet.
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;
}
}
In der vorherigen Implementierung übernimmt die GrainStateAccessor<T> Klasse getter und setter Argumente in ihrem Konstruktor. Diese Delegaten lesen und ändern den Zustand des Zielkorns. Die GetState() Methode gibt einen Task<TResult> Wrapper des gegenwärtigen Werts des T Zustands zurück, während die SetState(T state) Methode den neuen Wert des T Zustands festlegt.
Registrierung und Verwendung der Zustandsbearbeitungserweiterung
Um die Erweiterung für den Zugriff auf und die Änderung des Zielkornzustands zu verwenden, registrieren Sie die Erweiterung, und legen Sie die zugehörigen Komponenten in der Methode des Zielkorns Grain.OnActivateAsync() fest.
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();
}
Erstellen Sie im vorherigen Beispiel eine neue Instanz von GrainStateAccessor<int>, die mit einem getter und einem setter für einen ganzzahligen Zustandswert. Die getter liest die Value Eigenschaft des Zielkorns, während der setter den neuen Wert der Value Eigenschaft festlegt. Legen Sie diese Instanz dann mithilfe der IGrainContext.SetComponent Methode als Komponente des Zielkornkontexts fest.
Nachdem die Erweiterung registriert wurde, verwenden Sie sie, um den Status des Zielkorns abzurufen und festzulegen, indem Sie über einen Verweis auf die Erweiterung darauf zugreifen.
// 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);
Rufen Sie im vorherigen Beispiel einen Verweis auf die IGrainStateAccessor<int> Erweiterung für eine bestimmte Korninstanz mithilfe der GrainExtensions.AsReference Methode ab. Verwenden Sie dann diesen Verweis, um die Methoden GetState() und SetState(T state) aufzurufen, um den Statuswert des Zielobjekts zu lesen und zu ändern.