.NET Core – Console Application’da Dependency Injection Kullanımı
Merhaba,
.NET Core; uygulamada olası tüm kodsal bağımlılıkları minimize etmek ve biz yazılımcıları bu bağımlılıklardan soyutlayabilmek için Dependency Injection yaklaşımını benimsemiş bir mimaridir. Mecramızdaki birçok makale ve içerikte ilgili mimari ve yaklaşım üzerine yeterince izahatte bulunduğumuzu ve yer yer siz değerli okuyucularımızla da istişare ettiğimizi düşündüğümden dolayı konuyu direkt olarak asıl olması gereken noktaya odaklayarak .NET Core – Console Application uygulamalarında da bu nimetten nasıl faydalanabileceğimizi konuşacağımızı bildirmek isterim.
Her ne kadar Console Application uygulamalarında Dependency Injection uygulamaya çalışacak olsakta, çekirdek olarak .NET Core mimarisini kullanacağımızdan dolayı ilgili işi gerçekleştirebilmek için ilk olarak Core’un bazı özelliklerini tekrar masaya yatırmamız gerekmektedir.
.NET Core mimarisi, yapısı gereği service sağlayıcısı barındırmakta ve bu sağlayıcı sayesinde talep bulunulan nesneleri bizlere Dependency Injection dediğimiz yöntemle iletebilmektedir. Dolayısıyla Console Application uygulamalarında .NET Core mimarisinin service sağlayıcısına erişebilmeli ve oraya istediğimiz tanımlamaları yapabilmeliyiz.
Bu işlem için ilk olarak Solution Explorer penceresinden projeye sağ tıklayarak “Edit [ProjeAdı].csproj” sekmesine tıklayınız ve açılan pencerede aşağıdaki gibi Microsoft.AspNetCore.App kütüphanesini projeye Include ediniz.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project>
Yukarıdaki paketi uygulamaya dahil ettiğimiz taktirde servis sağlayıcısına bizleri eriştirecek olan “Microsoft.Extensions.DependencyInjection” kütüphanesi kullanılabilir olacaktır.
Şimdi servis sağlayıcısını kullanabilmek için aşağıdaki örnek sınıflarımızı oluşturuyoruz.
interface IConnection { bool Connection { get; set; } string ConnectionString { get; set; } } class SqlConnection : IConnection { public bool Connection { get; set; } public string ConnectionString { get; set; } }
interface ICommand { string Command { get; set; } void Execute(string command); void Execute(); } class SqlCommand : ICommand { public string Command { get; set; } public void Execute(string command) { Command = command; //. //Processing //. } public void Execute() { //. //Processing //. } }
Ardından hangi interface tipinde talep geldiğinde hangi nesneyi döneceğinin bilgisini aşağıdaki gibi servis sağlayıcımıza veriyoruz.
class Program { static void Main(string[] args) { ServiceProvider serviceProvider = new ServiceCollection() .AddTransient<IConnection, SqlConnection>() .AddTransient<ICommand, SqlCommand>() .BuildServiceProvider(); IConnection connection = serviceProvider.GetService<IConnection>(); ICommand command = serviceProvider.GetService<ICommand>(); Console.WriteLine(connection.GetType()); Console.WriteLine(command.GetType()); Console.Read(); } }
Yukarıdaki kod bloğunu incelerseniz eğer; “ServiceCollection” koleksiyonunda verdiğimiz tüm nesneler tutulmakta ve bunlar “BuildServiceProvider” metodu sayesinde servis sağlayıcısına atılmaktadırlar. Dolayısıyla artık “ServiceProvider” tipindeki nesnemiz ilgili sınıfları verildiği metodun işlevine göre(buradaki makalede tüm metotları ve işlevleri inceleyebilirsiniz) tutmakta ve talep geldiğinde ilgili sınıflardan nesneler döndürmektedir.
Nesne talebinide yine yukarıda 10 ve 11. satırlardaki komutlarda inceleyebilirsiniz. Provider üzerinden generic “GetService” fonksiyonu sayesinde talep edilen tipe uygun nesne gönderilmektedir. Haliyle 14 ve 15. satırlarda bunun ıspatıda gerçekleştirilmektedir.
İşte gördüğünüz gibi…
.NET Core – Console uygulamalarında Dependency Injection kullanarak çalışmalarınızı gerçekleştirmek istiyorsanız burada anlatıldığı gibi çalışma yapmanız sizin için oldukça yeterli olacaktır.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…