ขณะนี้ฉันกำลังออกแบบโซลูชัน n-tier ซึ่งใช้ Entity Framework 5 (.net 4) เป็นกลยุทธ์การเข้าถึงข้อมูล แต่ฉันกังวลเกี่ยวกับวิธีรวมการฉีดพึ่งพาเพื่อให้สามารถทดสอบ / ยืดหยุ่นได้
เค้าโครงโซลูชันปัจจุบันของฉันมีดังนี้ (โซลูชันของฉันชื่อ Alcatraz):
Alcatraz.WebUI : การ asp.net เว็บฟอร์มโครงการส่วนติดต่อผู้ใช้ปลายด้านหน้าอ้างอิงโครงการAlcatraz.BusinessและAlcatraz.Data.Models
Alcatraz.Business : โครงการห้องสมุดระดับมีตรรกะทางธุรกิจโครงการอ้างอิงAlcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : ห้องสมุดชั้นโครงการบ้านAlcatrazModel.edmxและAlcatrazEntities
DbContext อ้างอิงโครงการAlcatraz.Data.Models
Alcatraz.Data.Models : โครงการห้องสมุดคลาสมี POCO สำหรับรุ่น Alcatraz ไม่มีการอ้างอิง
วิสัยทัศน์ของฉันสำหรับวิธีการแก้ปัญหานี้จะทำงานเป็น web-UI จะยกตัวอย่างพื้นที่เก็บข้อมูลภายในห้องสมุดธุรกิจที่เก็บนี้จะมีการพึ่งพา (ผ่านตัวสร้าง) ของสตริงการเชื่อมต่อ (ไม่ใช่AlcatrazEntities
อินสแตนซ์) web-ui จะรู้จักสตริงการเชื่อมต่อฐานข้อมูล แต่ไม่ใช่ว่าเป็นสตริงการเชื่อมต่อของเฟรมเวิร์กเอนทิตี
ในโครงการธุรกิจ:
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 UI:
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();
ฉันมีคำถามที่เกี่ยวข้องกับการออกแบบนี้
การออกแบบนี้ทำให้รู้สึกถึงความสามารถของ Entity Frameworks หรือไม่? ฉันได้ยินมาว่า Entity framework ใช้รูปแบบหน่วยงานแล้วฉันจะเพิ่มเลเยอร์นามธรรมอีกชั้นหนึ่งโดยไม่จำเป็นหรือไม่
ฉันไม่ต้องการให้ web-UI ของฉันสื่อสารโดยตรงกับ Entity Framework (หรืออ้างอิงถึงเรื่องนั้น) ฉันต้องการให้การเข้าถึงฐานข้อมูลทั้งหมดผ่านชั้นธุรกิจเหมือนในอนาคตฉันจะมีหลายโครงการที่ใช้เลเยอร์ธุรกิจเดียวกัน (บริการเว็บแอปพลิเคชัน windows ฯลฯ ) และฉันต้องการให้ง่ายต่อการดูแลรักษา / ปรับปรุงโดยให้ตรรกะทางธุรกิจในพื้นที่ส่วนกลางเดียว นี่เป็นวิธีที่เหมาะสมในการบรรลุเป้าหมายนี้หรือไม่?
เลเยอร์ธุรกิจควรมีที่เก็บข้อมูลหรือควรอยู่ในเลเยอร์การเข้าถึงด้วยหรือไม่ หากพวกเขาอยู่ที่ไหนก็ดีการส่งผ่านสตริงการเชื่อมต่อเป็นการพึ่งพาที่ดีที่จะคิดหรือไม่?
ขอบคุณที่สละเวลาอ่าน!
DbContext
ว่าเป็นการพึ่งพา ชั้นธุรกิจมีพื้นที่เก็บข้อมูลเป็นการอ้างอิง สำหรับการฉีดพึ่งพาฉันทำด้วยตนเอง (ดังนั้นฉันเข้าใจว่าเกิดอะไรขึ้น) เหตุผลที่ฉันต้องการให้สามารถตั้งค่าสตริงการเชื่อมต่อบนDbContext
คือฉันใช้ฐานข้อมูล sharding ดังนั้นในบางกรณีฉันต้องมีกรอบงานเอนทิตี้เพื่อเชื่อมต่อกับฐานข้อมูลที่แตกต่างกัน (ของโครงสร้างเดียวกัน) ฉันเข้าใจคุณอย่างถูกต้องหรือไม่