Tôi hiện đang thiết kế một giải pháp n tầng đang sử dụng Entity Framework 5 (.net 4) làm chiến lược truy cập dữ liệu của nó, nhưng tôi lo ngại về cách kết hợp tiêm phụ thuộc để làm cho nó có thể kiểm tra / linh hoạt.
Bố cục giải pháp hiện tại của tôi như sau (giải pháp của tôi được gọi là lớp Methraz):
Orbitraz.WebUI : Một dự án biểu mẫu web asp.net, giao diện người dùng ở phía trước, tham khảo các dự án lớp Methraz.Business và lớp Methraz.Data.Models .
Orbitraz.Business : Một dự án thư viện lớp, chứa logic kinh doanh, tham khảo các dự án lớp Methraz.Data.Access , lớp Methraz.Data.Models
Alcatraz.Data.Access : Một dự án thư viện lớp, nhà AlcatrazModel.edmx và AlcatrazEntities
DbContext, tài liệu tham khảo dự án Alcatraz.Data.Models .
Orbitraz.Data.Models : Một dự án thư viện lớp, chứa POCO cho mô hình lớp Methraz, không có tài liệu tham khảo.
Tầm nhìn của tôi về cách giải pháp này hoạt động là web-ui sẽ khởi tạo một kho lưu trữ trong thư viện doanh nghiệp, kho lưu trữ này sẽ có một phụ thuộc (thông qua hàm tạo) của chuỗi kết nối (không phải là một AlcatrazEntities
thể hiện). Web-ui sẽ biết các chuỗi kết nối cơ sở dữ liệu, nhưng không phải đó là chuỗi kết nối khung thực thể.
Trong dự án kinh doanh:
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;
}
}
Trong giao diện người dùng 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();
Tôi có một vài câu hỏi liên quan về thiết kế này.
Thiết kế này thậm chí còn có ý nghĩa về khả năng của Entity Frameworks? Tôi nghe nói khung Entity đã sử dụng mẫu Đơn vị công việc, tôi chỉ cần thêm một lớp trừu tượng không cần thiết phải không?
Tôi không muốn web-ui của mình giao tiếp trực tiếp với Entity Framework (hoặc thậm chí tham chiếu nó cho vấn đề đó), tôi muốn tất cả quyền truy cập cơ sở dữ liệu sẽ đi qua lớp doanh nghiệp vì trong tương lai tôi sẽ có nhiều dự án sử dụng cùng một lớp doanh nghiệp (dịch vụ web, ứng dụng windows, v.v.) và tôi muốn dễ dàng duy trì / cập nhật bằng cách có logic kinh doanh ở một khu vực trung tâm. Đây có phải là một cách thích hợp để đạt được điều này?
Lớp Business thậm chí có nên chứa các kho lưu trữ hay nên được chứa trong lớp Access? Nếu nơi họ ổn, việc truyền chuỗi kết nối có phụ thuộc tốt không?
Cảm ơn đã dành thời gian để đọc!
DbContext
như là một phụ thuộc của nó. Các lớp kinh doanh có kho lưu trữ như một phụ thuộc. Đối với việc tiêm phụ thuộc, tôi đang thực hiện thủ công (vì vậy tôi hiểu những gì đang diễn ra). Lý do tôi muốn có thể thiết lập chuỗi kết nốiDbContext
là vì tôi sử dụng shending cơ sở dữ liệu nên trong một số trường hợp nhất định tôi cần phải có khung thực thể để kết nối với các cơ sở dữ liệu khác nhau (có cùng cấu trúc). Tôi có hiểu bạn đúng không?