Trong một hệ thống MVC, mã lưu trữ cơ sở dữ liệu nên nằm ở đâu?


21

Tôi đã thấy nhiều cấu hình để duy trì thông tin cho cơ sở dữ liệu. Nói chung, ba loại thiết kế dường như phổ biến ở góc của tôi trên thế giới:

  • Kiểm soát viên quản lý sự bền bỉ
  • Mô hình quản lý sự bền bỉ
  • Thư viện bên thứ ba quản lý sự bền bỉ, thường yêu cầu một số loại chú thích trên mô hình.

Tôi đang tự hỏi cấu hình nào (nếu có), về mặt khái niệm, dễ sử dụng nhất / tương thích nhất với kiến ​​trúc MVC?

(Nếu đó không phải là một trong những gì tôi liệt kê, xin vui lòng đưa ra một phác thảo / tổng quan nhanh như một phần của câu trả lời)

Câu trả lời:


13

Tùy chọn thứ hai và thứ ba của bạn là giống hệt nhau. M trong MVC không phải là mô hình dữ liệu, mà là mô hình miền. Điều này bao gồm sự kiên trì, cho dù được thực hiện trực tiếp hoặc thông qua ORM và cả hai đều hoàn toàn chính xác.

Bộ điều khiển nên quản lý lưu lượng của trang web và chuyển công cụ sang miền (đôi khi thông qua lớp dịch vụ) để xử lý, do đó vẫn tồn tại từ đó là sai - hoặc ít nhất là không thoải mái về mặt ngữ nghĩa.


2
Tôi không đồng ý ở một mức độ nhất định. Việc sử dụng cụ thể của tính bền vững là logic ứng dụng và do đó thuộc về Lớp ứng dụng chứ không phải trong Lớp miền. Lớp miền (chứa mô hình miền) nên không biết gì về tính bền bỉ của chương trình kinh doanh thông thường. Bộ điều khiển là một dàn nhạc . Nó có thể phối hợp các dịch vụ (dữ liệu), giao diện người dùng và mô hình miền.
Falcon

1
@Falcon: Mặc dù bộ điều khiển nên kiểm soát khi dữ liệu được tải từ và lưu vào cơ sở dữ liệu, nhưng nó hoàn toàn ổn khi yêu cầu mô hình làm như vậy. Sử dụng ORM (tiêu chuẩn hoặc cuộn của riêng bạn) thường có nghĩa là yêu cầu mô hình tải / lưu mà sau đó ủy quyền cho ORM. Một cách khác có thể là yêu cầu bộ điều khiển yêu cầu ORM tải / lưu thứ gì đó qua lớp mô hình để tải (với tiêu chí lựa chọn) hoặc thể hiện mô hình để lưu. Dù bằng cách nào, việc tải / lưu thực tế sẽ được gắn chặt với mô hình.
Marjan Venema

@Marjan Venema: Vâng, tôi đồng ý, nhưng câu hỏi là mã đó sẽ sống ở đâu. Tôi cố gắng giữ cho mô hình không biết gì về sự kiên trì nhất có thể và chỉ mô hình hóa các thực thể miền với các hành vi và tương tác của chúng. Bất cứ điều gì khác sẽ sống trong các lớp ứng dụng (vì đó là một ứng dụng của mô hình của tôi). Thông tin ánh xạ / truy cập dữ liệu được tách rời hoàn toàn khỏi mô hình miền và cũng có thể đảm nhiệm việc tạo phiên bản (nâng cấp / hạ cấp). Ứng dụng truy cập dữ liệu cũng nằm trong các lớp ứng dụng (có chứa các dịch vụ, kho lưu trữ, v.v.)
Falcon

@Falcon: Vâng, đó là một cách tốt để làm điều đó và là cách tôi đã thực hiện nó trong quá khứ bằng cách sử dụng các lớp ánh xạ riêng biệt. Tuy nhiên, với sự ra đời của RTTI (Delphi) và phản chiếu mở rộng (.Net và các loại khác), tôi không có ý định sử dụng chúng cùng với chú thích các thuộc tính của Mô hình Đối tượng Kinh doanh để mọi thứ diễn ra và chỉ sử dụng quá tải, móc mã vào và / hoặc các lớp khởi tạo được mã hóa cụ thể để chăm sóc phiên bản cơ sở dữ liệu.
Marjan Venema

5

Trên thực tế, MVC chủ yếu là một mô hình triển khai giao diện người dùng, vì vậy câu hỏi hơi khó. Tuy nhiên, thực sự chỉ có hai lựa chọn hình ảnh lớn. Trình điều khiển của bạn thường gửi các yêu cầu để tải hoặc lưu các thực thể trong mô hình của bạn bằng cách sử dụng 1) một lớp dịch vụ thuộc loại nào đó hoặc 2) mẫu Bản ghi hoạt động.

Lớp dịch vụ có thể có bất kỳ biểu mẫu nào, mặc dù sở thích cá nhân của tôi là làm việc với một bản tóm tắt kho lưu trữ cho các thực thể gốc tổng hợp, các triển khai cụ thể sẽ hoạt động với một loại ORM hoặc DAO nhẹ hoặc một DAO nhẹ hoặc API cho một số cửa hàng không liên quan nếu điều đó có ý nghĩa đối với ứng dụng.

Mẫu Bản ghi hoạt động có nghĩa là mô hình của bạn có trách nhiệm cho sự bền bỉ, mặc dù nó thường có nghĩa là một lớp cơ sở thuộc loại nào đó quản lý ánh xạ tới cửa hàng của bạn, vì vậy mô hình của bạn không thực sự liên quan trực tiếp.

Về cơ bản, bộ điều khiển gửi các yêu cầu đến các đối tượng bền vững, cho dù đó là cuộc gọi đến kho lưu trữ của bạn, triển khai UnitOfWork hoặc phương thức Save trên các thực thể của bạn. Nếu bạn đang sử dụng kho lưu trữ, các đối tượng mô hình của bạn là không biết gì.


3

Trong một hệ thống MVC (model-view-controller), mô hình chứa dữ liệu. Vì vậy, tôi tin rằng, sự kiên trì của cơ sở dữ liệu nên có trong đó.


2

Hầu hết các mẫu MVC cấp cao mà tôi thấy có một infrastructurelớp riêng có mã triển khai cơ sở dữ liệu thực tế (nghĩa là các lệnh gọi cụ thể đến NHibernate, hoặc EF hoặc Linq hoặc bất kỳ lớp dữ liệu nào của bạn), trong khi lớp "mô hình" (cũng thường lớp "Miền") có các giao diện xác định dịch vụ dữ liệu.


0

Thực tiễn tiêu chuẩn trong MVC là bao gồm cấu trúc dữ liệu và tính bền vững trong lớp M (odel).

Lớp mô hình không chỉ bao gồm các lớp (POCOs, v.v.) mà bạn sẽ sử dụng trong ứng dụng của mình. Chúng bao gồm các kho lưu trữ cho các lớp.

Một ví dụ sẽ là một kho lưu trữ nơi bạn có các nhóm các trường hợp dữ liệu, nghĩa là:

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

Bạn sẽ có thể sắp xếp tên miền mô hình của mình tốt hơn và cũng có quyền truy cập vào dữ liệu của bạn thông qua nhiều cách, nhưng lớp dữ liệu / mô hình sẽ nhỏ gọn và mạnh mẽ

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.