Saat ini saya sedang merancang solusi n-tier yang menggunakan Entity Framework 5 (.net 4) sebagai strategi akses datanya, tetapi saya khawatir tentang bagaimana memasukkan injeksi ketergantungan untuk membuatnya dapat diuji / fleksibel.
Tata letak solusi saya saat ini adalah sebagai berikut (solusi saya disebut Alcatraz):
Alcatraz.WebUI : Proyek webform asp.net, antarmuka pengguna ujung depan, referensi proyek Alcatraz.Business dan Alcatraz.Data.Models .
Alcatraz.Bisnis : Proyek perpustakaan kelas, berisi logika bisnis, referensi proyek Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : Proyek perpustakaan kelas, menampung AlcatrazModel.edmx dan AlcatrazEntities
DbContext, referensi proyek Alcatraz.Data.Models .
Alcatraz.Data.Models : Proyek perpustakaan kelas, berisi POCO untuk model Alcatraz, tanpa referensi.
Visi saya tentang bagaimana solusi ini akan bekerja adalah web-ui akan instantiate repositori dalam perpustakaan bisnis, repositori ini akan memiliki ketergantungan (melalui konstruktor) dari string koneksi (bukan sebuah AlcatrazEntities
instance). Web-ui akan mengetahui string koneksi database, tetapi tidak berarti bahwa itu adalah string koneksi kerangka kerja entitas.
Dalam proyek Bisnis:
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;
}
}
Di UI Web:
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();
Saya punya beberapa pertanyaan terkait tentang desain ini.
Apakah desain ini bahkan masuk akal dalam hal kemampuan Entity Frameworks? Saya mendengar bahwa kerangka kerja Entity sudah menggunakan pola Unit-of-work, apakah saya hanya menambahkan lapisan abstrak yang tidak perlu?
Saya tidak ingin web-ui saya berkomunikasi secara langsung dengan Entity Framework (atau bahkan merujuknya), saya ingin semua akses database melalui lapisan bisnis karena di masa depan saya akan memiliki beberapa proyek menggunakan lapisan bisnis yang sama (layanan web, aplikasi windows, dll.) dan saya ingin membuatnya mudah dikelola / diperbarui dengan memiliki logika bisnis di satu area pusat. Apakah ini cara yang tepat untuk mencapai ini?
Haruskah lapisan Bisnis bahkan berisi repositori, atau haruskah itu terkandung dalam lapisan Akses? Jika di mana mereka baik-baik saja, apakah meneruskan string koneksi ketergantungan yang baik untuk diasumsikan?
Terima kasih telah meluangkan waktu untuk membaca!
DbContext
sebagai ketergantungannya. Kelas bisnis memiliki repositori sebagai ketergantungan. Untuk injeksi ketergantungan, saya melakukan ini secara manual (jadi saya mengerti apa yang terjadi). Alasan saya ingin dapat mengatur string koneksi padaDbContext
adalah saya menggunakan basis data sharding sehingga dalam kasus-kasus tertentu saya perlu memiliki kerangka kerja untuk terhubung ke database yang berbeda (dari struktur yang sama). Apakah saya mengerti Anda dengan benar?