Merhaba arkadaşlar, bugün sizlere .net core Dependency Injection ve Custom Middleware yapısından bahsederek basit birer örnek yapacağız.
Dependency Injectionu bağımlılıkları azaltarak daha modüler ve geliştirilebilir kodlar yazmak için kullanırız. Asp .Net Core Dependency Injection yapısını kendi içerisinde barındırır. (Dışarıdan kütüphanelerde kullanılabilir; Autofac, SimpleInjection gibi).
Kendi içerisinde ki Dependency Injection için temelde üç farklı instance üretme metodu vardır. Kısaca bunlardan bahsederek hem constructor injection, hemde manuel injection yöntemiyle örnek yapacağız.
AddSingleton: Uygulama lifecycle boyunca tek bir instance olarak çalışır.
AddScoped: Request içerisinde bir instance oluşur.
AddTransient: Her çağrıldığında yeni bir instance oluşturur.
Startup.cs ,ConfigureServices metodu içerisinde servislerimizi register edelim.
services.AddTransient<INameService,NameService>(); services.AddTransient(typeof(IGenericService<>),typeof(GenericService<>)); //Genereic servis injection
Servislerimizi register ettikten sonra farklı kullanım yöntemleri vardır. Ben manuel injection ve constructor injection yöntemini göstermek istiyorum.
public HomeController(INameService nameService, IServiceProvider serviceProvider) { _nameService = nameService; //constructor injection _personGenericService = (IGenericService<Person>)serviceProvider.GetService(typeof(IGenericService<Person>)); //Manuel injection }
Dependency injection için basit bir örnekle iki farklı yöntemi gösterdik. Şimdi custom bir Middleware yazarak servisleri burada register edelim ve bunu ConfigureServices altında kullanalım.
Ayrıca Configure metodunda çağırmak içinde bir Middleware yazarak “test” route ekleyelim.
ApiMiddlewareExtensions sınıfımız içerisinde servis injectionlarımızı bize döndüren AddServiceInjections metodumuzu yazdık.
public static class ApiMiddlewareExtensions { public static IServiceCollection AddServiceInjections(this IServiceCollection services) { services.AddTransient<INameService,NameService>(); services.AddTransient(typeof(IGenericService<>),typeof(GenericService<>)); return services; } }
Artık bu metodu ConfigureServices altında çağırarak kullanabiliriz.
public void ConfigureServices(IServiceCollection services) { services.AddServiceInjections(); }
Aynı şekilde ednpoint routelarına test yazıldığında ekrana “Successfully registered custom route” yazdıran basit bir yapı kuralım.
public static IApplicationBuilder UseCustomRoute(this IApplicationBuilder builder) { return builder.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapGet("/test", async context => { await context.Response.WriteAsync("Successfully registered custom route"); }); }); //return builder.UseMiddleware<MyMiddleware>(); }
Commentlediğim yerlerde daha complex yapılar için basitçe bu yapıyı nasıl kullanabileceğinizi gösterdim.
Şimdi aynı şekilde Startup altında Configure sınıfında bu metodu çağırarak kullanabiliriz.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseCustomRoute(); }
Şimdi dotnet run komutu ile projemizi ayağa kaldırarak kontrol edelim.
Gördüğünüz gibi projemiz sorunsuz şekilde çalışıyor.
Size elimden geldiği kadar basit ve sade bir şekilde .Net Core dependency injection ve middleware yapısından bahsetmeye çalıştım, umarım faydalı olmuştur.
Aşağıda kaynak kodu ve farklı kaynakları paylaştım, inceleyebilirsiniz.
Kaynaklar
- https://docs.microsoft.com/tr-tr/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1
- https://medium.com/@feyyazacet/asp-net-core-microsoft-dependency-injection-container-f678eabd494e
- https://docs.microsoft.com/tr-tr/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1
- https://docs.microsoft.com/tr-tr/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1
Bu açıklayıcı ve akıcı anlatım için teşekkürler.