2009-09-24 28 views
9

Tôi đang trong quá trình thiết kế một trang web trong ASP.NET MVC và có lẽ một chút nhầm lẫn về bản chất chính xác của một kho lưu trữ.ASP.NET MVC: Có bao nhiêu kho lưu trữ?

Theo ví dụ về NerdDinner, trang web của tôi phải có một kho lưu trữ các thực thể khi tôi cần chúng. Tuy nhiên, tôi cũng đã nghe nói rằng bạn nên có kho lưu trữ khác nhau mà đối phó với bộ cụ thể của các thực thể liên quan ....?

Trong trường hợp trang web của tôi, sẽ có một số thực thể (khoảng 15 bảng) nhưng phần lớn đều liên quan. Có ok/khuyến khích để có một kho chứa tất cả các phương pháp mà tôi sẽ cần cho kéo/cập nhật/xóa vv hoặc tôi nên chia chúng xuống?

Trả lời

2

Tôi tạo kho lưu trữ cho từng đối tượng dữ liệu.

Ví dụ, một cơ sở dữ liệu thư viện đơn giản có thể chứa các kho sau:

  • AuthorRepository
  • BookRepository
  • PublisherRepository
+0

vì vậy trong trường hợp này, kho lưu trữ sẽ trả lại tất cả sách của một tác giả cụ thể? – Sergio

+0

Quyển sách, vì bạn đang yêu cầu sách – jao

+1

Tôi hiểu. Có lẽ im nghĩ về điều này một cách sai lầm nhưng có vẻ kỳ lạ .... về mặt thực thể (khuôn khổ thực thể trong trường hợp của tôi) tôi không thể không nghĩ rằng nếu tôi có tác giả thì tôi có những cuốn sách (ví dụ author.books) . Vì vậy, trong khía cạnh đó là có vẻ kỳ lạ để chia chúng thành các kho khác nhau. – Sergio

5

Nếu bạn sử dụng một kho lưu trữ chung chấp nhận các loại thì tôi không thấy bất kỳ lý do gì để sử dụng nhiều hơn một.

chúng tôi sử dụng một giao diện như thế này:

public interface IRepository 
{ 
    void Save<ENTITY>(ENTITY entity) 
     where ENTITY : Entity; 

    void Delete<ENTITY>(ENTITY entity) 
     where ENTITY : Entity; 

    ENTITY Load<ENTITY>(int id) 
     where ENTITY : Entity; 

    IQueryable<ENTITY> Query<ENTITY>() 
     where ENTITY : Entity; 

    IList<ENTITY> GetAll<ENTITY>() 
     where ENTITY : Entity; 

    IQueryable<ENTITY> Query<ENTITY>(IDomainQuery<ENTITY> whereQuery) 
     where ENTITY : Entity; 

    ENTITY Get<ENTITY>(int id) where ENTITY : Entity; 

    IList<ENTITY> GetObjectsForIds<ENTITY>(string ids) where ENTITY : Entity; 

    void Flush(); 
} 

sau đó sử dụng trong mã như thế này:

var returnedObjects = repository.GetAll<ObjectClass>(); 
var singleObject = repository.Get<ObjectClass>(id); 
2

Tôi nghĩ rằng có lẽ là nói dài giòng về những gì là một kho lưu trữ có thể gây nhầm lẫn bạn. Với tôi một kho lưu trữ là lưu trữ dữ liệu (ví dụ: Cơ sở dữ liệu MS SQL) nơi dữ liệu của bạn đang được lưu trữ.

Theo dõi Repository Pattern Tôi khuyên bạn nên thiết lập một đơn vị lưu giữ cho mỗi kho dữ liệu. Hầu hết các dự án của tôi, tôi sử dụng MS SQL vì vậy tôi tạo một Repository cho DB đó (tôi thích sử dụng Subsonic cho DAL/ORM của mình và nó cũng thực hiện mẫu Repositry và mẫu ActiveRecord) sau đó tôi tạo các Nhà máy cho mỗi bảng. Điều này cho phép tôi kết thúc các lớp Subsonic ActiveREcord và cho tôi sự trừu tượng hóa.

Hy vọng điều đó hữu ích, có lẽ ...

+0

Tôi tò mò về tuyên bố tạo kho lưu trữ cho từng kho dữ liệu. Điều gì sẽ xảy ra nếu tôi có một "thực thể" nhiều đến mức không làm gì hơn là chỉ lưu 2 ID (vì đó là khóa chính)? Tôi có cần phải tạo ra một kho lưu trữ ra khỏi đó, hoặc tôi có thể chỉ bao gồm một số các phương pháp lấy/lưu cơ bản trong một kho lưu trữ liên quan khác? Tôi nghĩ các kho lưu trữ nên tập trung hơn vào các thực thể tổng hợp. – CitizenBane

+0

Cảm ơn tất cả những người trả lời - rất hữu ích. Tuyến đường 'chung' này đã khiến tôi quan tâm dù là người mới bắt đầu mà tôi không chắc tôi sẽ làm thế nào để thiết lập nó. Tôi đang sử dụng khung thực thể làm ORM của tôi .... – Sergio

8

tôi sử dụng một generic kho mà rất nhiều đối với nhiều người thực thể.

Để phức tạp hơn, tôi chỉ đơn giản là mở rộng điều này với những gì cần thiết. Tốt nhất của cả hai thế giới thực sự.

8

Trong thiết kế định hướng theo miền, có một quy tắc lưu trữ là trên mỗi gốc tổng hợp. Bạn có thể đọc thêm về nó here.

Tôi càng đọc, tôi càng nghĩ NerdDinner quá thường xuyên được xem như một tập hợp các thực hành tốt, trong khi hoàn toàn không (xem here để thảo luận, đặc biệt là kho NerdDinner).Đó là lý do người ta thường đổ lỗi cho ví dụ MS khác như Oxite (và here:

nhà phát triển sẽ đổ xô đến nó, khen ngợi nó, và mù quáng chấp nhận nó như là phúc âm vì nó xuất phát từ Microsoft (đó là đã tốt trên con đường của mình). Đáng buồn thay, bất kỳ nhà phát triển mà thông qua tinh thần của nó sẽ được trái với một unmaintainble, untestable và không thể đọc lộn xộn

).

+1

Gõ một sự thật ... –

+0

+1 liên kết đầu tiên thực sự tốt! –

0

Tôi có xu hướng sử dụng kho lưu trữ cho mỗi nhóm quyền lợi liên quan. tức là orderrepository có thể có:

Đặt hàng và OrderDetail.

và sẽ có một cách khác cho, ví dụ: Khách hàng, CustomerProfile, v.v.

Điều này giúp cho các lớp kho lưu trữ gọn gàng.

Davy

1

Queen3 là đúng, bạn có thể làm theo lý thuyết Tổng hợp gốc đó. Tôi về cơ bản nhóm kho lưu trữ của tôi không suy nghĩ trong thực thể nhưng làm thế nào họ nhóm hợp lý trong ứng dụng tôi đang xây dựng.

Ví dụ:

CustomersRepository 
OrdersRepository 
... 

Trong CustomerRepository tôi sẽ đưa các phương pháp GetCustomers, GetCustomer, AddCustomer, DeleteCustomer, AddCustomerContact, DeleteCustomerContact.

Trong đơn đặt hàngBưu trữ, tôi sẽ đặt các phương thức cho GetOrders, GetOrder, AddOrder, CancelOrder, CloneOrder, AddOrderDetail, DeleteOrderDetail và vv.

2

Bạn không nên tạo kho lưu trữ cho mỗi bảng. Như queen3 đã nói, bạn nên tạo Repository cho mỗi gốc tổng hợp. Giống như, nếu Sản phẩm có thể có Danh mục, Danh mục lưu trữ phải là một lớp lồng nhau của Sản phẩm. Theo dõi mối quan hệ logic miền so với các đối tượng miền.

Các vấn đề liên quan