Saat mengembangkan berbagai aplikasi yang menggunakan pustaka
Castle Windsor yang populer untuk
menyuntikkan dependensi dan
Apache Ignite.NET sebagai "kunci" yang membuka pintu ke cloud computing, saya menghadapi sedikit ketidaknyamanan: Saya tidak punya cara untuk menyuntikkan ketergantungan ke dalam layanan yang diluncurkan melalui yang disebut Service Grid.
Alasan ini terjadi sangat lumrah. Apache Ignite.NET membuat serial layanan, mengirimkannya ke salah satu server yang tersedia, di mana layanan itu dibatalkan dan diluncurkan. Karena proses ini sama sekali tidak memiliki petunjuk tentang Castle Windsor, kami mendapatkan apa yang kami dapatkan.
Untuk mengatasi masalah ini, kita perlu membuat plug-in untuk Apache Ignite.NET, yang akan menerima sebuah wadah yang bertanggung jawab untuk mengimplementasikan dependensi dan menyediakan layanan dengan kesempatan untuk mengaksesnya untuk menerima objek.
Pertama-tama, kami akan memperkenalkan tingkat abstraksi tambahan untuk wadah, yang menyediakan injeksi ketergantungan, sehingga di masa mendatang kami dapat dengan mudah mengubah implementasinya ke yang lain:
public interface IContainer { T Resolve<T>(); }
public class DependencyInjectionContainer : IContainer { protected IKernel Kernel { get; set; } public DependencyInjectionContainer(IKernel kernel) { Kernel = kernel; } public T Resolve<T>() { return Kernel.Resolve<T>(); } }
public class DependencyInjectionInstaller : IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component .For<IContainer>() .ImplementedBy<DependencyInjectionContainer>() ); } }
Untuk membuat plug-in, kita perlu membuat 3 kelas: kelas yang bertanggung jawab untuk konfigurasi plug-in, penyedia plug-in dan, secara langsung, plug-in itu sendiri.
public class DependencyInjectionPlugin { public IContainer Container { get; set; } public T Resolve<T>() { return Container.Resolve<T>(); } }
[PluginProviderType(typeof(DependencyInjectionPluginProvider))] public class DependencyInjectionPluginConfiguration : IPluginConfiguration { public void WriteBinary(IBinaryRawWriter writer) {
public class DependencyInjectionPluginProvider : IPluginProvider<DependencyInjectionPluginConfiguration> { public string Name { get; } = "DependencyInjection"; public string Copyright { get; } = "MIT"; protected DependencyInjectionPlugin DependencyInjectionPlugin { get; set; } public T GetPlugin<T>() where T : class { return DependencyInjectionPlugin as T; } public void Start(IPluginContext<DependencyInjectionPluginConfiguration> context) { DependencyInjectionPlugin = new DependencyInjectionPlugin(); } public void Stop(bool cancel) { } public void OnIgniteStart() { } public void OnIgniteStop(bool cancel) { } }
Hebat, masih memuat plugin di Apache Ignite.NET.
public class IgniteInstaller : IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component .For<IIgnite>() .UsingFactoryMethod(() => Ignition.Start(new IgniteConfiguration { PluginConfigurations = new[] {new DependencyInjectionPluginConfiguration()} })) ); } }
Ketika aplikasi dimulai, kita, seperti biasa, menginisialisasi wadah injeksi ketergantungan, tetapi sekarang kita siap untuk meneruskannya ke plugin yang baru saja kita tulis:
var Done = new ManualResetEventSlim(false);
Selamat, jika Anda membaca sampai akhir, maka Anda bisa mendapatkan ketergantungan dari wadah Anda di dalam layanan. Ini terlihat seperti ini:
public class ClientConnectionService : IClientConnectionService, IService { private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); [InstanceResource] private IIgnite Ignite { get; set; } public void Init(IServiceContext context) { Logger.Debug("Initialized"); } public void Execute(IServiceContext context) { var plugin = Ignite.GetPlugin<DependencyInjectionPlugin>("DependencyInjection"); var whatever = plugin.Resolve<IWhatever>(); whatever.DoSomething(); } public void Cancel(IServiceContext context) { Logger.Debug("Canceled"); } }