Şu anda, veri erişim stratejisi olarak Entity Framework 5'i (.net 4) kullanan n katmanlı bir çözüm tasarlıyorum, ancak test edilebilir / esnek hale getirmek için bağımlılık enjeksiyonunu nasıl dahil edeceğim konusunda endişeliyim.
Mevcut çözüm düzenim aşağıdaki (çözümüm Alcatraz olarak adlandırılıyor):
Alcatraz.WebUI : Bir asp.net webform projesi, ön uç kullanıcı arayüzü, Alcatraz.Business ve Alcatraz.Data.Models projelerine referans veriyor .
Alcatraz.Business : Bir sınıf kütüphane projesi, iş mantığını içerir, referans projeleri Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : Bir sınıf kütüphane projesi, AlcatrazModel.edmx ve AlcatrazEntities
DbContext'e ev sahipliği yapar, Alcatraz.Data.Models projelerine referans verir .
Alcatraz.Data.Models : Bir sınıf kütüphanesi projesi, Alcatraz modeli için POCO içerir, referans yok.
Bu çözümün nasıl işleyeceğine dair vizyonum, web-ui'nin iş kütüphanesinde bir havuz oluşturmasıdır, bu havuzun bir bağlantı dizesine ( AlcatrazEntities
örnek değil) bağımlılığı (yapıcı aracılığıyla ) olacaktır. Web-ui veritabanı bağlantı dizelerini bilir, ancak bu bir varlık çerçevesi bağlantı dizesi değildir.
İşletme projesinde:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
Web kullanıcı arayüzünde:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
Bu tasarımla ilgili birkaç sorum var.
Bu tasarım Varlık Çerçeveleri yetenekleri açısından bile anlamlı mı? Entity çerçevesinin zaten Çalışma Birimi kalıbını kullandığını duydum, sadece gereksiz bir şekilde başka bir soyut katman ekliyor muyum?
Web kullanıcı arayüzümün Entity Framework ile doğrudan iletişim kurmasını istemiyorum (hatta bu konu için referansta bulunuyorum), tüm veritabanı erişiminin iş katmanından geçmesini istiyorum, gelecekte aynı iş katmanını kullanan birden fazla projeye sahip olacağım (web servisi, windows uygulaması vb.) ve iş mantığının tek bir merkezi alanda bulunmasını kolay bir şekilde sürdürmesini / güncellemesini istiyorum. Bunu başarmanın uygun bir yolu var mı?
Business katmanı depolar içermeli mi, yoksa Access katmanı içinde mi yer almalı? Eğer bulundukları yer uygunsa, bir bağlantı dizesini geçmek iyi bir bağımlılık mıdır?
Okumak için zamanınızı ayırdığınız için teşekkürler!
DbContext
bir bağımlılığını kabul eder . İşletme sınıflarının bir bağımlılığı olarak depoları vardır. Bağımlılık enjeksiyonu için, bunu manuel olarak yapıyorum (bu yüzden neler olduğunu anlıyorum). Üzerinde bağlantı dizesini ayarlamak istiyorum nedeni benDbContext
bazı durumlarda (aynı yapının) farklı veritabanlarına bağlanmak için varlık çerçeve olması gerekir böylece veritabanı parçalama kullanmaktır. Seni doğru anladım mı?