Đây có phải là thiết kế xấu? Làm thế nào nó có thể được cải thiện?


9

Tôi đã viết lại một lúc sau, nhưng tôi đã đến để xem lại nó gần đây và bây giờ không nghĩ rằng đó là thiết kế tốt.

Thiết kế dành cho một loại lớp cơ sở dữ liệu mô đun sử dụng Entity Framework 4. Có một đối tượng cơ sở dữ liệu duy nhất tải bối cảnh khung thực thể (lười biếng) từ các thư viện bên ngoài trong một vị trí xác định và các trường hợp của bối cảnh được tải được lưu trữ trong bảng băm tên của họ (EG "ContentMgmtContext").

Tất cả các liên hệ với cơ sở dữ liệu trong hệ thống này là thông qua các thủ tục được lưu trữ. Để thực hiện cuộc gọi đến cơ sở dữ liệu, chữ ký phương thức truy vấn trông như thế này:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Mô-đun này là một cái gì đó tôi thích. Tuy nhiên, có một nhược điểm đáng kể đối với phương pháp này: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.Trong mô hình, các đối tượng từ lớp cơ sở dữ liệu được dịch sang các đối tượng mới mà khung nhìn và trình điều khiển sử dụng.

Tôi nghĩ rằng đây là thiết kế xấu, nhưng làm thế nào tôi có thể cải thiện nó? Tôi đã xem xét việc thêm một giao diện trống như IStoredProecedureObjectcung cấp cho mọi loại dữ liệu được trả về bởi một thủ tục được lưu trữ thành một loại cơ sở chung, tuy nhiên điều này dường như bị xóa bởi Entity Framework. Mỗi khi .edmxtệp được biên dịch lại, mã được tạo lại và bất kỳ bổ sung nào bị xóa. Có cách nào để ngăn chặn điều này xảy ra?

Làm thế nào tôi có thể cải thiện thiết kế này? Điều gì (khác) là sai với nó? Hay tôi đang đi đúng hướng?

Câu trả lời:


6

Tuyên bố miễn trừ trách nhiệm: Tôi không sử dụng khung thực thể và rất thiên vị đối với bất kỳ khung trợ giúp cơ sở dữ liệu nào.

Có vẻ như bạn đã thực hiện một bọc.

Tôi phân biệt giữa "lớp bọc" và "lớp". Lớp là thứ bạn có thể biên dịch thành DLL / dự án / Jar / bất cứ thứ gì. Lớp truy cập dữ liệu. Wrapper là một lớp "người trợ giúp" mà bạn sử dụng trong DLL đó. Với mục đích đơn giản hóa giao diện, hoặc có thể loại bỏ sự trùng lặp.

Vấn đề đơn giản hóa giao diện truy cập cơ sở dữ liệu là nó không đơn giản. Cuối cùng, bạn sẽ sao chép giao diện của ADO / JDBC / vv. Hoặc bạn buộc mọi người bỏ qua nó. Wrappers có xu hướng làm tất cả các loại không mong muốn. Họ có thể tự động đóng kết nối khi bạn cần mở để hỗ trợ giao dịch. Họ thường để nhầm các kết nối mở nếu bạn phải truyền dữ liệu và đang sử dụng một trong những ngôn ngữ được thu gom rác. Để cung cấp toàn bộ sức mạnh của thư viện đằng sau trình bao bọc của bạn, bạn buộc phải sao chép nó.

Các thư viện như ADO / JDBC đã là một giao diện TUYỆT VỜI. Chúng là một số ví dụ tốt nhất về OOP được thực hiện đúng. Tôi thích sử dụng chúng hơn một cái bọc mà một số wizbang rút ra khỏi mũ của anh ta.

Giao diện kiểu JDBC / ADO cổ điển được biết đến và hiểu rõ. Cái bọc bạn rút ra khỏi mũ thì không.

Bạn muốn giảm "paramters.Add" dư thừa? Nhìn vào thuốc generic. Hoặc chỉ chấp nhận điều đó bằng cách cố gắng giảm "paramter. Thêm", bạn thực sự chỉ cần đẩy ".add" sang một lớp mã khác.

BTW đây là một câu hỏi tuyệt vời. Tôi sẽ nâng nó lên 10 lần nếu tôi có thể.

Chỉnh sửa: Tất nhiên mã JDBC sẽ bị ẩn trong lớp truy cập dữ liệu.


Tôi đồng ý, nhìn nhận lại, đây là một trình bao bọc xung quanh EF 4 hơn chính nó. Ý tưởng đằng sau nó là cho phép các phần kết nối cơ sở dữ liệu khác nhau (như mô hình dữ liệu tiêu chuẩn) được sử dụng lại trong khi cũng có một điểm nhập duy nhất cho nhiều cơ sở dữ liệu, mỗi cơ sở có đặc tính tái sử dụng. Trình bao bọc cơ sở dữ liệu này được biên dịch vào một thư viện riêng (cùng với logic nghiệp vụ khác). Làm thế nào bạn có thể đề nghị tôi thay đổi thiết kế của tôi để cải thiện nó?
Andy Hunt

+1 cho nội dung tuyệt vời mặc dù Xu hướng EF của bạn ... mặc dù EF không chỉ là khung trợ giúp DB. Bạn nói đúng về việc anh ấy cố gắng làm một cái bọc cho cái này.
SoylentGray
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.