Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Asp.NET Core – Çok Katmanlı Mimaride İstenilen Katmanda Dependency Injection Kullanımı

Merhaba,

Önceki içeriklerimizden Asp.NET Core 3.0 – Çok Katmanlı Mimaride Migration İşlemleri başlıklı makalemizde çok katmanlı mimari yapılanmasının migration işlemleriyle birlikte yapısal inceliklerini ele almıştık. İlgili makaleye göz atarsanız eğer, katmanlar arasında DAL -> BL -> PL olması gereken ilişkiyi DAL -> PL && (BL -> PL) şeklinde kurduğumuzu göreceksiniz. Bunun nedeni DAL katmanı aracılığıyla veritabanından gelen verileri BL katmanında işleyebilmek için BL katmanında DAL katmanındaki repository, context vs. nesnelerinin dependency injection ile talep edilebiliyor olması gerekmektedir. Bunun içinde PL katmanında talep edilen bu nesneler BL’ye gönderilmekte ve dolayısıyla PL’de DAL katmanını referans göstermek mecburiyetinde kalınmaktadır. Bu mecburiyet esasında çok katmanlı mimari dediğimiz stratejik yaklaşımı zedelemekte ve stratejide taktiksel hataya sebebiyet vermektedir. İşte bizler bu makalemizde BL katmanında PL’ye gereksinim duymaksızın dependency injection stratejisinin nasıl uygulaması gerektiğini ele alacak ve ortaya mimarisel açıdan ideal yaklaşımın nasıl olması gerektiğini irdeleyerek, doğru yapılanmanın somut örneğini geliştireceğiz.

Yani uzun lafın kısası; PL katmanında DAL katmanını referans etmeksizin(mesela “Startup.cs” dosyasına context nesnesini AddDbContext ile eklemeksizin) tüm veritabanı işlemlerini BL katmanında ihtiyaca dönük nasıl yapılandırılacağını inceleyeceğiz.

Şimdi adım adım çok katmanlı mimari yaklaşımını benimsediğimiz bir proje geliştirelim. Herşeyden önce en temel katmanımız olan DAL katmanını ele alarak işe başlayalım.

Üretilen Servislerin Enjekte Edilmesi

Bu işlem için yapılması gereken tek şey PL katmanında Startup.cs dosyasının “ConfigureServices” metodunda “AddRepositoryService” isimli metodu çağırmaktır. Böylece tüm repository nesnelerimiz uygulamaya inject edilmiş olacaktır. Peki hoca, context nesnesini nasıl inject edeceğiz? sorunuzu duyar gibiyim… Hatırlarsanız eğer onu zaten BL katmanındaki oluşturduğumuz Repository sınıfında inject edip kullanmıştık. O yüzden PL’de context nesnesine dair inject işlemine gerek yoktur.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            services.AddRepositoryService();
            .
            .
        }
    }

Bu işlemin ardından artık controller sınıflarınızı, context nesnelerini inject etmeye ihtiyaç duymaksızın oluşturabilir ve endpointler yahut actionlarınızı repository ile gönül rahatlığıyla kullanabilirsiniz.

Örnek bir controller;

    public class PersonelController : Controller
    {
        readonly PersonelRepository _personelRepository;
        public PersonelController(IRepository<Personel> personelRepository)
        {
            _personelRepository = (PersonelRepository)personelRepository;
        }
        public IActionResult Index()
        {
            return View(_personelRepository.Get());
        }

        public IActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Create(Personel model)
        {
            _personelRepository.Add(model);
            _personelRepository.Save();
            return RedirectToAction("Index");
        }
    }

Nihai olarak;
Genellikle DAL katmanında oluşturulan context sınıfının PL’de kullanılarak işlevsel olarak problem yaratmayan ama çok katmanlı mimari stratejisinin etiğine aykırı olan bu davranışı irdelediğimiz yöntemde olduğu gibi ortadan kaldırmış ve stratejiyi olması gereken en doğru yöntemlerle, prensibe uygun bir şekle getirip oturtturmuş bulunmaktayız.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek projeyi indirebilmek için buraya tıklayınız.

Exit mobile version