Ekstensi biji-bijian
Ekstensi biji-bijian menyediakan cara untuk menambahkan perilaku tambahan ke biji-bijian. Dengan memperluas biji-bijian dengan antarmuka yang berasal dari IGrainExtension, Anda dapat menambahkan metode dan fungsionalitas baru ke biji-bijian.
Dalam artikel ini, Anda akan melihat dua contoh ekstensi biji-bijian. Contoh pertama menunjukkan cara menambahkan Deactivate
metode ke semua biji-bijian yang dapat digunakan untuk menonaktifkan biji-bijian. Contoh kedua menunjukkan cara menambahkan GetState
metode dan SetState
ke biji-bijian apa pun, memungkinkan Anda memanipulasi status internal biji-bijian.
Nonaktifkan contoh ekstensi
Dalam contoh ini, Anda akan mempelajari cara menambahkan Deactivate
metode ke semua biji-bijian secara otomatis. Metode ini dapat digunakan untuk menonaktifkan biji-bijian dan menerima string sebagai parameter pesan. Orleans biji-bijian sudah mendukung fungsionalitas ini melalui IGrainManagementExtension antarmuka. Namun demikian, contoh ini berfungsi untuk menunjukkan bagaimana Anda dapat menambahkan fungsionalitas ini atau serupa sendiri.
Menonaktifkan antarmuka ekstensi
Mulailah dengan mendefinisikan IGrainDeactivateExtension
antarmuka, yang berisi Deactivate
metode . Antarmuka harus berasal dari IGrainExtension
.
public interface IGrainDeactivateExtension : IGrainExtension
{
Task Deactivate(string msg);
}
Menonaktifkan implementasi ekstensi
Selanjutnya, terapkan GrainDeactivateExtension
kelas , yang menyediakan implementasi untuk metode .Deactivate
Untuk mengakses butir target, Anda mengambil IGrainContext
dari konstruktor. Ini disuntikkan saat membuat ekstensi dengan injeksi dependensi.
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;
}
}
Menonaktifkan pendaftaran dan penggunaan ekstensi
Sekarang setelah Anda menentukan antarmuka dan implementasi, Anda mendaftarkan ekstensi saat mengonfigurasi silo dengan AddGrainExtension metode .
siloBuilder.AddGrainExtension<IGrainDeactivateExtension, GrainDeactivateExtension>();
Untuk menggunakan ekstensi pada butir apa pun, ambil referensi ke ekstensi dan panggil Deactivate
metode .
var grain = client.GetGrain<SomeExampleGrain>(someKey);
var grainReferenceAsInterface = grain.AsReference<IGrainDeactivateExtension>();
await grainReferenceAsInterface.Deactivate("Because, I said so...");
Contoh ekstensi manipulasi status
Dalam contoh ini, Anda mempelajari cara menambahkan GetState
metode dan SetState
ke biji-bijian apa pun melalui ekstensi, yang memungkinkan Anda memanipulasi status internal biji-bijian.
Antarmuka ekstensi manipulasi status
Pertama, tentukan IGrainStateAccessor<T>
antarmuka, yang berisi GetState
metode dan SetState
. Sekali lagi, antarmuka ini harus berasal dari IGrainExtension
.
public interface IGrainStateAccessor<T> : IGrainExtension
{
Task<T> GetState();
Task SetState(T state);
}
Setelah Anda memiliki akses ke butir target, Anda dapat menggunakan ekstensi untuk memanipulasi statusnya. Dalam contoh ini, Anda menggunakan ekstensi untuk mengakses dan memodifikasi nilai status bilangan bulat tertentu dalam butir target.
Implementasi ekstensi manipulasi status
Ekstensi yang Anda gunakan adalah IGrainStateAccessor<T>
, yang menyediakan metode untuk mendapatkan dan menetapkan nilai status jenis T
. Untuk membuat ekstensi, Anda mengimplementasikan antarmuka di kelas yang mengambil getter
dan setter
sebagai argumen dalam konstruktornya.
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;
}
}
Dalam implementasi sebelumnya, GrainStateAccessor<T>
kelas mengambil getter
dan setter
argumen dalam konstruktornya. Delegasi ini digunakan untuk membaca dan memodifikasi status butir target. Metode GetState()
mengembalikan Task<TResult> nilai T
status saat ini, sementara SetState(T state)
metode menetapkan nilai T
baru status.
Pendaftaran dan penggunaan ekstensi manipulasi status
Untuk menggunakan ekstensi untuk mengakses dan memodifikasi status butir target, Anda perlu mendaftarkan ekstensi dan mengatur komponennya dalam Grain.OnActivateAsync() metode butir target.
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();
}
Dalam contoh sebelumnya, Anda membuat instans GrainStateAccessor<int>
baru yang mengambil getter
dan setter
untuk nilai status bilangan bulat. getter
membaca Value
properti butir target, sementara setter
menetapkan nilai Value
baru properti. Anda kemudian mengatur instans ini sebagai komponen konteks butir target menggunakan metode .IGrainContext.SetComponent
Setelah ekstensi terdaftar, Anda dapat menggunakannya untuk mendapatkan dan mengatur status butir target dengan mengaksesnya melalui referensi ke ekstensi.
// 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);
Dalam contoh sebelumnya, Anda mendapatkan referensi ke IGrainStateAccessor<int>
ekstensi untuk instans biji-bijian tertentu menggunakan metode .GrainExtensions.AsReference Anda kemudian dapat menggunakan referensi ini untuk memanggil GetState()
metode dan SetState(T state)
untuk membaca dan memodifikasi nilai status butir target.