2009-02-20 44 views
6

Tôi đang triển khai Lớp Truy cập Dữ liệu (DAL), về cơ bản là một tập hợp các lớp với các hàm được chia sẻ (VB.NET) để thực thi các cuộc gọi cơ sở dữ liệu (CRUD). Tôi đang cố gắng tìm ra nơi tốt nhất để thực hiện các cuộc gọi đến DAL trong hệ thống phân cấp lớp. Để tôi lấy một ví dụ.OOP - Nơi đặt các cuộc gọi đến Lớp Truy cập Dữ liệu?

Giả sử tôi có một lớp Khách hàng, chỉ với các ID tiêu chuẩn, Tên, Địa chỉ1, v.v ... và có thể là chức năng ToString bị ghi đè. Tôi cũng có một lớp DAL với các phương pháp chung, chẳng hạn như:

(pseudocode) 

Namespace Dal 

Public Class Customer 

Public Shared Function Read(id As Integer) As Customer 

Public Shared Function ReadList() As List(Of Customer) 

Public Shared Sub Create(c As Customer) 

'etc. 

Bây giờ, tôi có thể gọi Dal từ các lớp trình bày như sau:

Me.DataGridView1.Datasource = Dal.Customer.ReadList 

Tuy nhiên, là nó không phải là một thói quen tốt có lớp trình bày nhận thức về Dal ở tất cả? Tôi có nên đặt các phương thức trong đối tượng Customer và gọi Dal, như thế này không?

Public Function ReadList() As List(Of Customer) 
    Return Dal.Customer.ReadList() 
End Sub 

Public Sub Create() 
    Dal.Customer.Create(Me) 
End Sub 

Đây có phải là OOP "sạch hơn" không? Hoặc là thực tế có thể chấp nhận để cho bản trình bày gọi Dal, chuyển các đối tượng kinh doanh như ví dụ trước của tôi:

Me.DataGridView1.Datasource = Dal.Customer.ReadList 

Dim c As New Customer 
c.Name = "Alpha Corporation" 
c.Address1 = "123 Main Street" 
Dal.Customer.Create(c) 

Cảm ơn phản hồi của bạn.

Trả lời

2

Tôi đồng ý rằng các cuộc gọi dữ liệu không thuộc về lớp giao diện người dùng. Đó là những bài thuyết trình.

Tôi cho rằng chúng thuộc về một lớp dịch vụ. Việc triển khai dịch vụ sử dụng các đối tượng mô hình và lớp kiên trì để hoàn thành các mục tiêu của nó. Cho dù đó là một dịch vụ web dựa trên XML hay giao diện cục bộ, dịch vụ là đối tượng ánh xạ tới các trường hợp sử dụng và biết về các đơn vị công việc.

Hoặc đặt các cuộc gọi cơ sở dữ liệu vào một lớp kiên trì riêng biệt hoặc nhúng chúng vào các đối tượng mô hình để có độ tinh khiết hướng đối tượng bổ sung.

+0

Tất cả ba người trả lời đều có câu trả lời tuyệt vời, nhưng tôi phải chọn một câu trả lời đúng. Cảm ơn mọi người! – HardCode

4

Ứng dụng của bạn càng ít biết về DAL càng tốt. Có một số cách để làm điều này và tôi nghĩ rằng bạn đang đi đúng hướng. Tôi nghĩ bạn có thể muốn xem xét factory pattern cho việc triển khai này vì bạn sẽ có thể ẩn triển khai DAL phía sau nhà máy và trả về các thực thể và tập hợp các thực thể từ nhà máy.

+0

Vì vậy, nhà máy sẽ ngồi giữa DAL và lớp trình bày, với phương thức gọi lớp trình bày trong nhà máy? Điều này giống với lớp dịch vụ được tham chiếu bởi duffymo? – HardCode

+0

Sắp xếp - mẫu nhà máy chỉ là một mẫu - nó có thể được thực hiện dưới dạng một lớp dịch vụ nếu bạn muốn. –

1

Lý do tại sao bạn muốn kéo các hoạt động CRUD vào một lớp riêng biệt trong trường hợp bạn muốn thay đổi hệ thống cơ sở dữ liệu. Vâng, đó là lý do tại sao tôi đã làm nó. Tôi sẽ không khuyên bạn nên làm điều này chỉ để được tốt OOD. Nhưng ở đây ya đi ...

Một số bộ lớp/giao diện

BusinessObject - Đại diện loại thực thể kinh doanh như một khách hàng, có DataManager như một tài sản.

DataManager - Có lẽ bạn có thể tìm ra một cái tên hay hơn, nhưng điều này cung cấp chức năng Save() Load() và cho BusinessObjects

SearchList - Trả danh sách của sự vật, các truy vấn SQL của bạn tại đây. Ngoài ra, điều này có thể hoạt động giống như một RecordSet với các thành viên Next(), Eof() và CurrentRecord

Constructor/Factory - Xem FactoryPattern. Bạn đã bỏ các hoạt động cơ sở dữ liệu của bạn khỏi các đối tượng kinh doanh của bạn, điều này sẽ kết hợp chúng lại một cách cần thiết.Chỉ định triển khai datamanager thích hợp cho BusinessObject

Hãy đến với bất kỳ tên thực tế nào bạn muốn, nhưng hãy nói về Khách hàng một lần nữa. Giả sử bạn có một cơ sở dữ liệu Oracle. Bạn có thể kết thúc với các lớp:

boCustomer được thừa kế từ BusinessObject

oracleDMCustomer thừa kế hoặc thực hiện DataManager

searchlistCustomer được thừa kế từ searchlist đã tiếp xúc hoặc thông qua các phương pháp trừu tượng hoặc như là một cái gì đó giao diện như sau:

  • SearchAll() - mà phải trả lại tất cả khách hàng
  • SearchByZip (string zip) mà nên trở lại tất cả khách hàng với mã bưu điện cho

oracleSearchlistCustomer - thực hiện searchlistCustomer, trên thực tế sẽ thực hiện SearchAll() và SearchByZip()

boFactory - lớp tĩnh có một phương pháp mà trông giống như CreateObject (Type type)

danh sách tìm kiếmNhà máy - lớp tĩnh có phương thức giống như CreateSearchList (Loại loại);

Tôi sẽ để bạn điền vào một số chỗ trống, nhưng tôi nghĩ rằng những thứ quan trọng là ở đó. Những người khác có thể có những ý tưởng khác nhau đòi hỏi ít trừu tượng hơn. Tôi sẽ giả lập một số chiến lược trước khi đi với một.

+0

Nội dung hay. Cảm ơn! – HardCode

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