ASPNET Core Dependency Injection Kullanarak Uygulama Geliştirmek yazımızda, NET Core platformunda Dependency Injection kullanımı ve faydaları üzerinde duruyoruz NET Core Kapsayıcısının kullanımına farklı senaryolarda yer veriyor ve örneklerle anlatıyoruz ASPNET Core uygulama geliştirmeye dair bilgiler edinmek isteyenler için ideal bir kaynak!

ASP.NET Core projesinde uygulama geliştirme sürecinde dependency injection kullanarak kodun daha okunaklı ve bakımının daha kolay olmasını sağlayabilirsiniz. Dependency injection, uygulama geliştirme sürecinde bağımlılıkların azaltılmasına ve kodun daha anlaşılır hale getirilmesine yardımcı olur.
ASP.NET Core'da dependency injection, IServiceCollection arayüzü aracılığıyla gerçekleştirilir. Bu arayüz kullanılarak uygulama servisleri kaydedilir ve dependency injection kullanılarak servislerin kullanımı sağlanır. Dependency injection yöntemi, tüm uygulama sürecinde servisleri yönetmek için kullanılabilir. Servisler, uygulama sürecinde tüm yollarla kullanılabilir ve özelleştirilebilir.
ASP.NET Core'da dependency injection kullanarak uygulama geliştirme daha esnek ve anlaşılırdır. Dependency injection, uygulama geliştirme sürecinde hatayı azaltır ve uygulama kodunun daha okunaklı hale getirerek, uygulamanın daha iyi yönetilmesini sağlar.
Dependency Injection (DI) Nedir?
Dependency injection (DI), bir yazılım bileşenine gerekli olan başka bir bileşenin bağımlılıklarının otomatik olarak yönetildiği bir tasarım desenidir. Yani, bir bileşenin işlevselliğini yerine getirebilmesi için başka bir bileşene ihtiyaç duyduğunda, DI kullanarak bu bağımlılıkların yönetimi otomatik olarak gerçekleştirilir. Bu sayede, bileşenler birbirini sıkı bir şekilde bağlamadan ve esnek bir şekilde çalışabilirler.
Dependency injection'in birçok faydası vardır. Öncelikle, bir bileşenin herhangi bir başka bileşene bağımlılığı olabileceği için, DI bunların otomatik olarak yönetilmesini sağlar ve kod daha okunaklı ve bakımı daha kolay hale gelir. Ayrıca, DI kullanarak bileşenlerin birbirine sıkı bir şekilde bağlanmasından kaçınarak, kodun tekrar kullanılabilirliği artırılabilir. Bunların yanı sıra, DI, yazılım bileşenlerinin test edilmesini ve çeşitli ortamlarda çalıştırılmasını kolaylaştırır.
ASP.NET Core'da Nasıl Kullanılır?
Dependency injection, ASP.NET Core projesinde kolayca kullanılabilecek bir özelliktir. Dependency injection kullanarak servisler ve nesneler arasındaki bağımlılıkları yönetebilirsiniz. Bu yöntem, kodun okunaklılığını ve bakımını sağlar. Şimdi, ASP.NET Core projesinde dependency injection kullanımı örnekleriyle birlikte anlatılacaktır.
Servislerin kaydı, ConfigureServices() metodu içinde yer alır. Aşağıdaki örnek web API projesinde bir IUserService servisi kaydedilmektedir:
Kayıt Tipi | Servis Tipi | Uygulanacak Sınıf |
---|---|---|
Scoped | IUserService | UserService |
Yukarıdaki tabloda, kayıt tipi "Scoped" olarak işaretlenmiştir. "Scoped" servisleri, her bir istek için özgün bir nesne oluşturur. Bağımlılıkların yönetilmesinde bu servis tipi kullanılabilir.
Bir başka örnek ise, ILogger servisinin kaydıdır. ILogger servisi, uygulamanın hata veya bilgilendirme gibi kayıtlarını yapan bir servistir. Aşağıdaki kod bloğunda ILogger servisi kaydedilir:
services.AddLogging();
Yukarıdaki örnekte, AddLogging() metodu kullanılarak ILogger servisi kaydedilir.
Kodun okunaklılığı ve bakımı için, servis kayıtları Configure() metodu içinde yapılabilir:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory){ loggerFactory.AddFile("Logs/mylog-{Date}.txt"); //...}
Yukarıdaki örnekte, ILoggerFactory servisi kulalnılarak bir dosyaya logların kaydedilmesi sağlanmaktadır.
Dependency injection kullanarak, uygulamanın bakımı ve okunaklılığı kolaylaştırılırken, aynı zamanda servisler arasındaki bağımlılık da etkin bir şekilde yönetilebilir.
Servis Kayıt İşlemleri
Dependency injection (DI), yazılım geliştirme sürecinde sıklıkla kullanılan bir tasarım kalıbıdır. DI, bağımlılıkların yönetimini kolaylaştırır ve kodun daha okunabilir ve bakımı daha kolay hale getirir. ASP.NET Core projesinde Dependency injection kullanmak, geliştirme sürecinde zaman kazandırır ve kaliteli bir kod yazılmasına olanak sağlar. Servis kayıt işlemleri, Dependency injection modülüne erişmek ve servisler arasındaki farkları anlamak için öncelikle bu konular hakkında bilgi sahibi olmak gerekir.
ASP.NET Core projesinde servis kayıt işlemleri, ConfigureServices() metodu içinde yapılır. Bu metod, uygulama başlatıldığında çalıştırılır ve projedeki tüm servisleri kaydeder. Servisler, Add methodu ile eklenir. Örneğin, DBContext servisini kaydetmek için aşağıdaki kod bloğu kullanılabilir:
public void ConfigureServices(IServiceCollection services){ services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));}
Dependency injection modülüne erişmek için, uygulama örneklemesi içinde IServiceProvider arabirimi kullanılır. Örneğin, aşağıdaki kod bloğu ile IConfiguration servisine erişilebilir:
using Microsoft.Extensions.Configuration;public MyClass(IConfiguration configuration){ string defaultConnection = configuration.GetConnectionString("DefaultConnection");}
ASP.NET Core projesinde kullanılan servis çeşitleri arasında Scoped, Transient ve Singleton seçenekleri bulunur. Scoped servisler, her HTTP isteği için bir örnek oluşturur. Transient servisler ise her çağırıldığında yeni bir örnek oluşturur. Singleton servisler ise aynı örneğin her istekte kullanılır. Hangi servis tipinin kullanılacağı, uygulamanın gereksinimlerine göre belirlenir. Özelleştirilmiş servisler de kendi ihtiyaçlarınıza özel olarak uygulamanın içinde tanımlanabilir.
Scoped, Transient ve Singleton Servisleri
ASP.NET Core'da kullanılan servis çeşitleri arasında en yaygın olan üç tanesi Scoped, Transient ve Singleton'dır. Bu seçeneklerin farklı özellikleri bulunmaktadır.
Scoped servisler, her request için bir kez oluşturulurlar ve aynı request içinde kullanılırlar. Yani, her request'te yeni bir scoped servis oluşturulur. Scoped servisler, özellikle veritabanı işlemleri için kullanılmalıdır. Böylece, veritabanına yapılan her işlem için yeni bir servis örneği oluşacak ve tek bir request içinde tüm veriler kullanılabilecektir.
Transient servisler, her talep karşılandığında yeniden oluşturulurlar. Yani, her bir request için yeni bir transient servis oluşturulur. Transient servislerin örnekleri özellikle stateless hizmetlerde kullanılır. Çünkü her bir istek, diğerlerinden bağımsız olarak ele alınır ve verilerin tutulmasına gerek yoktur.
Singleton servisleri ise uygulama yaşam döngüsü boyunca yalnızca bir kez oluşturulur ve tüm istekler için aynı örneği kullanılır. Bunlar, özellikle performansı artırmak veya yapılandırma değerlerini tutmak için, ayarlamalarda kullanılır.
Ayrıca, özel bir servis oluşturmak da mümkündür. Bu, kişiselleştirilmiş gereksinimleriniz için özel bir servis oluşturmanız gerektiğinde kullanılır. Özel servisler için kayıt işlemleri yapmak gerekir ve ardından dependency injection servislerine erişebilirsiniz.
Servis Tipi | Özellikleri | Kullanım Alanları |
---|---|---|
Scoped | Her request için bir kez oluşturulur kullanılır. | Veritabanı işlemleri için kullanılır. |
Transient | Her talep karşılandığında yeniden oluşturulur. | Stateless hizmetlerde kullanılır. |
Singleton | Uygulama yaşam döngüsü boyunca yalnızca bir kez oluşturulur. | Performansı artırmak veya yapılandırma değerlerini tutmak için ayarlamalarda kullanılır. |
Özelleştirilmiş Servisler
Özelleştirilmiş servisler, ASP.NET Core projesindeki standart servislerin belirli gereksinimleri karşılamadığı durumlarda kullanılır. Bu gereksinimler örneğin, üçüncü taraf bir kütüphanenin veya SDK'nın özelleştirilmiş bir servisine sahip olma ihtiyacı olabilir.
Bir özelleştirilmiş servisi oluşturmak için, IServiceCollection arayüzünün AddScoped, AddTransient veya AddSingleton yöntemlerinden birini kullanabilirsiniz. Kendi servis sınıfınızı oluştururken, bir arayüz adı ve bir de implementasyon sınıfı adı belirtmeniz gerekir.
Örneğin, aşağıdaki kod özelleştirilmiş bir ILoggerFactory servisi kaydeder:
public interface ICustomLoggerFactory { ILogger CreateLogger();}public class CustomLoggerFactory : ICustomLoggerFactory { public ILogger CreateLogger() { // implementation here }}public void ConfigureServices(IServiceCollection services){ services.AddScoped<ICustomLoggerFactory, CustomLoggerFactory>();}
Yukarıdaki örnekte, ICustomLoggerFactory adlı bir arayüz ve CustomLoggerFactory adlı bir sınıf oluşturuldu. Daha sonra, ConfigureServices methodunda, services.AddScoped yöntemi kullanıldı ve ICustomLoggerFactory arayüzünü ve CustomLoggerFactory sınıfını belirtildi.
Bir servisi kullanmak için, startup dosyasındaki constructorlarınıza IServiceCollection bağımlılığını ekleyin ve daha sonra oluşturulan servisleri kullanabilirsiniz. Ayrıca, servislerinizin doğru yerde ve doğru şekilde kullanılabilmesi için, servis kaydı yaparken belirli diğer servislerin de birlikte kaydı yapıldığından emin olun.
Özelleştirilmiş servisler, ASP.NET Core projesinin oldukça güçlü bir özelliğidir ve projenizde büyük ölçüde esneklik sağlar.
Dependency Injection Kullanarak Test Etmek
Dependency injection kullanımının faydaları arasında uygulamanın test edilmesi için kolaylık sağlaması yer almaktadır. Dependency injection sayesinde, uygulamanın test edilmesi sırasında ihtiyaç duyulan herhangi bir yerde, gerçek uygulama yerine bir sahte nesne kullanılabilir. Bu, uygulamanın test sürecini daha hızlı ve daha az maliyetli hale getirir.
ASP.NET Core ile birlikte, birbirinden bağımsız bileşenlerden oluşan uygulamalar oluşturmak mümkündür. Ancak uygulamaların test edilmesi, bu bağımsızlıktan dolayı zorluklar ortaya çıkarabilir. Bu zorlukların üstesinden gelmek için, dependency injection kullanımı önemlidir.
Dependency injection kullanarak uygulama test etmek için gerekli adımlar şunlardır:
- Sahte nesneleri (mock objects) oluşturma
- Bağımlılıkları doğru şekilde yapılandırma
- Uygulamanın fonksiyonlarına sahte nesneleri enjekte etme
- Uygulamanın test edilmesi
Bu adımlar, uygulamaların test edilmesini kolaylaştıran dependency injection kullanımının avantajlarından sadece birkaçıdır. Dependency injection kullanımı, uygulamanın test sürecindeki esnekliği artırır ve kodun test edilebilirliğini artırarak, hatayı minimize etmeye yardımcı olur.
Dependency Injection Kullanımının Faydaları
Dependency Injection (DI) kullanımı, bir uygulamanın bağımlılıklarını yönetme işlemidir. Bu yöntem, birçok avantaj sağlar ve bu nedenle birçok geliştirici tarafından tercih edilir. DI kullanımının önde gelen faydaları:
- Bakımı kolay hale getirir: DI sayesinde, bağımlılıklar bir yerde toplanır ve uygulama içindeki herhangi bir değişiklik, sadece bu toplanan alana yapılır. Bu nedenle, uygulamanın bakımı daha kolay hale gelir.
- Kodun daha okunabilir hale gelir: DI, kodu daha okunabilir hale getirir. DI kullanımı, kodun hangi bağımlılıklara eriştiğini belirtir, bu nedenle kod daha anlaşılır ve kolay okunur hale gelir.
- Test işlemleri daha kolay hale gelir: DI sayesinde, kodun test edilmesi daha kolay ve daha az zaman alır. Kod parçaları, birbirinden bağımsız olarak test edilebilir ve test sonuçları daha güvenilir hale gelir.
- Kodun tekrar kullanımı artar: DI sayesinde, kod yeniden kullanılabilir hale gelir. Tekrar kullanılabilir kod blokları oluşturmak, uygulamanın genel sürekliliğini artırır ve daha hızlı olmasını sağlar.
Bu avantajlar, DI kullanımının neden tercih edilmesi gerektiği konusunda açık bir cevap vermektedir. DI, uygulamanın daha ölçeklenebilir ve yönetilebilir olmasını sağlar ve genel olarak kodun kalitesini artırır.
Bağımlılıkların Yönetimi
Bağımlılıkların yönetimi, bir uygulamanın düzgün çalışması için önemli bir faktördür. Dependency injection kullanarak bağımlılıkların yönetimi kolaylaştırılır. Dependency injection sayesinde, bir sınıfın, bir başka sınıf tarafından kullanılması gereken özellikleri, constructor veya property üzerinden otomatik olarak enjekte edilir. Bu, uygulamayı daha esnek hale getirir ve kodun okunabilirliğini artırır.
Dependency injection, büyük projelerde kullanıldığında, kodun repeatable olduğunu kanıtlar. Proje geliştiricisi, yazmak zorunda olduğu kod miktarını azaltabilir ve daha verimli bir şekilde çalışabilir. Ayrıca, bu yöntem, bir servisin başka bir servisi kullanacağı durumlar için idealdir. Bu sayede, kod tekrarına ve yapısal olarak benzer servislere ihtiyaç duyulmadan, daha az kod kullanılarak yeni bir servis oluşturulabilir.
Dependency injection kullanımı aynı zamanda, uygulamanızın test edilmesini de kolaylaştırır. Testler, bir sınıfın veya metotun, diğer sınıf ve metotlardan bağımsız olarak test edilebilmesini sağlar. Bu, uygulamanın daha hızlı ve daha verimli bir şekilde test edilmesi anlamına gelir.
Bağımlılıkların yönetimi, bir uygulamanın stabilitesi ve performansı için daha önemli hale geldi. Bu nedenle, uygulamaların geliştiricileri, bu yöntemi kullanarak, bağımlılıkların yönetimini daha verimli hale getirebilirler. Dependency injection kullanarak, uygulamanızı daha esnek, okunması ve test edilmesi daha kolay hale getirebilirsiniz.
Kodun Daha Okunabilir ve Bakımı Daha Kolay
Dependency injection kullanımının bir diğer faydası, kodun daha okunaklı ve bakımının daha kolay hale getirilebilmesidir. Bir uygulamayı geliştirirken, sınıflar arasındaki bağlantılar sıkı bir şekilde ileriye doğru programlanır. Ancak, bir sınıfta yapılan herhangi bir değişiklik, bağlı sınıflarda da güncelleme gerektirebilir. Bu süreç zaman alıcı ve hatalara neden olabilir.
Depency injection kullanarak, her bir sınıfın bağımlılıkları, uygulamanın başlatılması sırasında derlenir ve enjekte edilir. Bu şekilde, sınıflar arasındaki bağlantılar daha esnek hale gelir ve uygulamanın bakımı daha kolay hale gelir. Ayrıca, sınıflar arasındaki bağlantılar açıkça belirtilerek kodun daha okunaklı hale gelir.
Örneğin, bir e-ticaret uygulaması geliştiriyorsanız ve sipariş işlemleriyle ilgilenen bir sınıfınız varsa, bu sınıfın ödeme işlemi için başka bir sınıfa bağımlı olduğunu düşünelim. Geleneksel bir uygulamada, ödeme işlemi ile ilgili kod, sipariş işlemlerinin sınıfına doğrudan entegre edilir. Ancak, dependency injection kullanarak, sipariş işlemleri sınıfı için gerekli olan ödeme işlemleri bağımlılığı, bir servis olarak kaydedilir ve enjekte edilir. Bu sayede, ödeme işlemi ile ilgili değişiklikler yapmak istendiğinde, sadece bağımlı servis değiştirilir ve sipariş işlemleri koduna dokunulmaz.
Kodun Tekrar Kullanılabilirliği Artar
Kodun tekrar kullanılabilirliği bir uygulamanın geliştirilmesinde büyük önem taşır. Dependency injection kullanarak uygulama geliştirmenin en büyük faydalarından biri, kodun tekrar kullanılabilirliğinin artmasıdır.
Dependency injection sayesinde, bir bileşenin birden fazla yerde kullanılabilmesi sağlanır. Bu, uygulama geliştirirken kodun tekrar kullanılabilirliğinin artması anlamına gelir. Kodun tekrar kullanılabilir hale gelmesi sayesinde zaman kazanılır ve uygulama geliştirme sürecinde hızlı bir ilerleme sağlanır.
Ayrıca, kodun tekrar kullanılabilir olması, kodun daha az yazılmasına da neden olur. Bu, kodun daha az hatalı olmasını sağlar ve uygulama geliştirme sürecinde hata düzeltme işlemleri de kolaylaşır. Dependency injection sayesinde, kodun tekrar kullanılabilir hale gelmesi, uygulama geliştirme sürecini daha verimli hale getirir.
Özetle, dependency injection kullanarak uygulama geliştirme yöntemi, kodun tekrar kullanılabilirliğinin artmasını sağlar. Bu da, uygulama geliştirme sürecinde zaman kazandırır, hata düzeltme işlemlerini kolaylaştırır ve kodun daha az yazılmasına neden olur.