2010-05-01 11 views
23

Có một số câu hỏi tương tự về vấn đề này, bởi tôi vẫn chưa tìm thấy đủ lý do để quyết định nên đi đường nào.NHibernate có hoặc không có Kho lưu trữ

Câu hỏi thực sự là hợp lý với abstract the NHibernate using a Repository pattern hoặc not?

Có vẻ như lý do duy nhất đằng sau việc trừu tượng hóa nó là để lại cho mình một tùy chọn để thay thế NHibernate bằng một ORM khác nếu cần. Nhưng việc tạo kho và truy vấn trừu tượng có vẻ như thêm một lớp khác và thực hiện phần lớn hệ thống ống nước bằng tay.

Một tùy chọn là sử dụng hiển thị IQueryable<T> cho lớp doanh nghiệp và sử dụng LINQ, nhưng từ kinh nghiệm LINQ của tôi vẫn chưa được triển khai đầy đủ trong NHibernate (truy vấn đơn giản không phải lúc nào cũng hoạt động như mong đợi, và tôi ghét dành thời gian để gỡ lỗi một khuôn khổ).

Mặc dù tham chiếu NHibernate trong lớp doanh nghiệp của tôi làm đau mắt, nhưng nó được cho là một sự trừu tượng của truy cập dữ liệu của chính nó, phải không?

Bạn có ý kiến ​​gì về điều này?

+0

Làm cách nào để thêm một mục mới vào cơ sở dữ liệu bằng LINQ? – Paco

+0

@Paco: Thêm một mục mới vào cơ sở dữ liệu khá dễ trừu tượng, tôi không nói về điều đó. Truy vấn là vấn đề thực tế, vì không có cách đơn giản để cho phép các truy vấn phức tạp thông qua một kho lưu trữ mà không cần mã hóa đầy đủ. – Groo

Trả lời

5

Thứ tốt nhất. Tôi cũng đã nghĩ về họ cách đây vài ngày.

Thực ra, hãy thử NHibernate 3.0 alpha (hoặc thân cây hiện tại), nhà cung cấp LINQ mới của nó lớn hơn nhiều so với các nhà cung cấp trước đó. (Cho đến nay tôi chỉ tìm thấy một phương pháp không hoạt động, nhưng có thể móc trong cơ chế của riêng bạn nếu bạn gặp phải thứ gì đó mà nó không hỗ trợ theo mặc định.) Tôi chưa gặp vấn đề gì với việc sử dụng hiện tại Thân cây. Bạn có thể tìm thấy bản dựng "hàng đêm" trên trang web http://www.hornget.net/packages/ cùng với bản dựng FluentNHibernate chống lại nó. Lưu loát thực sự làm tăng năng suất của bạn nếu bạn biết cách sử dụng nó. Cộng đồng SO really helped me with that cũng vậy.

Nếu bạn đồng ý với lớp doanh nghiệp của bạn có sự phụ thuộc trực tiếp vào NHibernate hoặc bạn đang viết một ứng dụng nhỏ hơn mà vẫn có thể duy trì mà không có kiểu trừu tượng này, bạn nên đi mà không có mẫu kho lưu trữ. Tuy nhiên, nếu bạn làm đúng, nó có thể giúp bạn tiết kiệm rất nhiều mã dự phòng.

Lý do trừu tượng hóa nó không chỉ hữu ích bởi vì sau đó bạn có thể thay thế NHibernate sau này bằng ORM khác, nhưng nó là một thực hành tốt vì một khái niệm gọi là Separation of Concerns. Lớp logic nghiệp vụ của bạn không quan tâm hoặc biết bất kỳ điều gì về cách truy cập dữ liệu mà nó hoạt động. Điều này làm cho việc duy trì ứng dụng hoặc các lớp khác nhau của nó dễ dàng hơn, điều này cũng làm cho việc làm việc nhóm trở nên dễ dàng hơn: Nếu X tạo lớp truy cập dữ liệu và Y viết logic nghiệp vụ, họ không phải biết chi tiết về công việc của nhau.

Hiển thị IQueryable<T> là một ý tưởng hay và đó chính xác là những gì nhiều triển khai kho lưu trữ đang hoạt động ngay bây giờ. (Và tôi cũng vậy, mặc dù tôi thích viết nó trong một lớp tĩnh.) Và tất nhiên bạn sẽ phải vạch trần một số phương pháp để chèn hoặc cập nhật thực thể hoặc phương thức bắt đầu và giao dịch, nếu bạn muốn. (BeginTransaction chỉ nên trả lại một IDisposable để tránh rò rỉ ra một giao diện NHibernate, và điều đó sẽ ổn thôi.)

Tôi có thể cung cấp cho bạn một số hướng dẫn: kiểm tra triển khai của SharpArchitecture hoặc FubuMVC Contrib để có được một số ý tưởng về cách thực hiện đúng rồi, và đây là how I solved it.

+0

Cảm ơn câu trả lời. Trên thực tế, những gì tôi muốn nói là sử dụng HNibernate để truy vấn dữ liệu trực tiếp không nên để lộ việc triển khai cơ sở dữ liệu đến tầng kinh doanh một cách đáng kể, khi bạn ánh xạ hai mô hình này lại với nhau. Tôi tin rằng đó là ý tưởng ban đầu đằng sau khái niệm ORM. Cá nhân, sự thật là tôi không muốn sử dụng nó trực tiếp, nhưng một mẫu kho lưu trữ (nếu tôi không trưng ra IQueryable) yêu cầu mã hóa bổ sung. Sử dụng LINQ sẽ đáng yêu, nếu nó đáng tin cậy. Có lẽ tôi sẽ thử phiên bản alpha :). – Groo

+0

Tôi không có vấn đề gì (chưa?) Với việc sử dụng thân cây hiện tại. Đã cập nhật câu trả lời của tôi. – Venemo

1

Tôi chỉ đơn giản là nói CÓ lớn! có mẫu Repository, giữ mọi thứ trừu tượng!

1

Cá nhân tôi vẫn thích trừu tượng ra NHibernate thành mẫu lưu trữ. Lý do là tôi vẫn có thể triển khai thực hiện kho lưu trữ, lưu trữ các bài kiểm tra đơn vị, vv Và tôi cũng sử dụng IQueryable với kho lưu trữ của mình, mặc dù tôi làm cho IRepository mở rộng IQueryable hơn là trưng ra một thuộc tính trên IRepository của loại IQueryable.

Điểm lưu trữ khác. Một số người đề xuất không làm cho nó chung chung và có nhận dạng loại ở cấp phương thức (ví dụ: repository.Load). Tuy nhiên, điều này giả định rằng sẽ có một kho lưu trữ duy nhất biết cách xử lý tất cả các loại. Tôi không phải là một fan hâm mộ lớn của khái niệm này của một kho lưu trữ nguyên khối duy nhất. Nếu bạn đang làm việc với nhiều cơ sở dữ liệu thì sao? Hoặc nhiều cơ chế kiên trì? Hoặc một số loại dữ liệu vẫn khá tĩnh và có thể được lưu trong bộ nhớ cache, nhưng một số khác thì không thể. Đây là lý do tại sao tôi thích một cá thể kho lưu trữ riêng biệt cho từng loại.