Özet olarak şekildeki gibi bir proje yapısı var. Repository Pattern içerisinde ORM aracı ile veritabanı işlemlerini yapıyorum. Fakat, bazı noktalarda, ORM araçlarını kullanmadan (iş kuralı gereği) saf SQL işletmem gerekiyor.
Temel CRUD (Create, Read, Update, Delete) işlemleri için ORM kullanıyorum. Fakat, veritabanı içerisinde değişiklik yapmayacağım, sadece veri çekeceğim tablolar var.
Yani uygulama üzerinden; kayıt ekleme, silme, güncelleme yapılacak tablolara ORM ile ulaşmak. Sadece raporlama için veri çekilecek tablolara ise direk SQL veya SP, Views, ... şeklinde ulaşmam gerekiyor. Belki tam anlatamadım ama kod ile anlatmaya çalışayım.
interface ICustomerRepository
{
public List GetCustomers();
}
CustomerRepositoryFromORM implements ICustomerRepository
{
public List GetCustomers()
{
return entity.Customers;
}
}
CustomerRepositoryFromSQL implements ICustomerRepository
{
public List GetCustomers()
{
string query = "Select * From Customers";
return ExecuteSQL(query);
}
}
Yukarıdaki gibi bir yapıda Bu repository i servis e nasıl enjekte edeceğiz. Servis içerisinde normalde repository i aşağıdaki gibi enjekte ediyorum.
CustomerService implements ICustomerService
{
private ICustomerRepository customerRepository;
public CustomerService (ICustomerRepository _customerRepository)
{
this.customerRepository = _customerRepository;
}
}
Tam anlatabildim mi bilmiyorum ama, İşin özeti resimdeki gibi bir yapı içerisinde, farklı veri kaynaklarından veri çekerken, Repository ve Service sınıflarının yapısı nasıl olmalı. Aynı interface den türeyen farklı sınıflar, en etkin şekilde nasıl enjekte edilmeli (veya bağımlılığı kaldıran farklı bir yöntem). Benim yukarıda yaptıklarımdan farklı bir yapıda olabilir. Hatta cok farklı bir mimari de (yukarıdaki mimari tercihimdir). Amacım uygulamanın, değişiklikler karşısındaki kırılganlığını en az seviyeye düşürmek. Bu konudaki tavsiyeleriniz nelerdir?
Teşekkürler.