2009-06-30 34 views
5

Tôi hiện đang đại diện cho Lớp kinh doanh và Lớp dữ liệu trong một dự án duy nhất trong ứng dụng của mình. Tôi có sự phân chia rất tốt mối quan tâm giữa hai nhóm lớp học. Tuy nhiên, các lớp Lớp dữ liệu của tôi lấy làm tham số và trả về các đối tượng nghiệp vụ của tôi. Vì vậy, tôi sẽ có mã lỏng lẻo giống (xin đừng quá quan trọng của mã này, mã sản xuất của tôi không giống nhiều như thế này):Tôi làm cách nào để tách riêng Lớp kinh doanh và Lớp dữ liệu của mình?

//business class fragment 
public bool Save() 
{ 
    if(this.IsValid) 
    { 
     //DataProvider is one of many data access classes that implement an IDataProvider interface. Switched elsewhere in the class. This allows switching of Database providers, xml, etc. 
     DataProvider.Save(this); 
     return true; 
    } 
    return false; 
} 

public List<MyBusinessObject> GetObjectsByCriteria(string criteria) 
{ 
    return DataProvider.GetMyBusinessObjectsByCriteria(criteria); 
} 

Tôi không muốn các lớp doanh nghiệp của tôi phải đối phó với DataSets nhiều hơn tôi muốn có lớp Data Layer của tôi đối phó với Business Classes.

Tôi đã đọc rất nhiều về Đối tượng truy cập dữ liệu hoặc Đối tượng chuyển dữ liệu để giải quyết vấn đề này, nhưng điều này có vẻ giống như trường hợp chống mẫu cho các mẫu đó.

Tôi có thể làm gì? Làm cách nào để tao nhã hoàn thành việc tách biệt hoàn toàn hai lớp ứng dụng của tôi?

Trả lời

2

Đây là vấn đề chung chung hơn là cách tách Mô hình miền khỏi Truy cập dữ liệu. Cùng một vấn đề xảy ra khi bạn cố gắng tách Logic ứng dụng của bạn khỏi mô hình Miền của bạn, Mô hình trình bày của bạn từ Logic ứng dụng và vv.

Giải pháp chung là một kỹ thuật được gọi là Dependency Injection (DI). Một số người cũng gọi nó là Inversion of Control (IoC).

Văn bản tiêu đề về chủ đề này là bài viết của Martin Fowler Inversion of Control Containers and the Dependency Injection pattern, nhưng chúng tôi đã đi một chặng đường dài kể từ đó, vì vậy hãy chắc chắn kiểm tra một số văn bản gần đây nữa.

Bạn có thể triển khai DI theo cách thủ công, như described in this blog post hoặc bạn có thể cho phép DI Container (tức làmột khung công tác) thực hiện công việc cho bạn.

Common DI container là:

1

Kéo logic bền bỉ ra khỏi đối tượng doanh nghiệp của bạn và đặt chúng vào Dữ liệu Adapter. Nó sẽ hoạt động giống như cách các adapter hiện có trong .NET làm việc (OleDbDataAdapter). Bằng cách này bạn cũng sẽ tách các đối tượng kinh doanh của bạn và logic tồn tại.

Mã của khách hàng của bạn sẽ tiết lộ chi tiết hơn một chút, nhưng tôi nghĩ đó thực sự là cách tốt nhất để thực sự phân tách các lớp.

+0

Đây là những gì chúng tôi làm, nhưng chúng tôi cũng kết hợp nó với DTO. –

0

Mẫu phổ biến để thực hiện điều này là mẫu Kho lưu trữ. Trong trường hợp này, Repository hoạt động như một mặt tiền sử dụng ngữ nghĩa bộ sưu tập, ẩn hoàn toàn nơi dữ liệu tồn tại tồn tại, cho dù đó là hệ thống tệp hay cơ sở dữ liệu. Bạn có thể triển khai nó để truy cập dữ liệu, sau đó ánh xạ dữ liệu tới bất kỳ loại nào bạn muốn làm việc.

Bạn có thể xem Thiết kế Driven miền thay thế cho mẫu Bản ghi đang hoạt động mà nó xuất hiện mà bạn đang sử dụng.

0

Bạn nên xem mẫu DAO (Đối tượng truy cập dữ liệu). http://en.wikipedia.org/wiki/Data_Access_Object

Tốt nhất là sử dụng cấu trúc DAO sẵn sàng (lò xo được nạp). Hãy xem http://trac.synyx.org/hades

DAO không phải là một mẫu giả mạo! Sử dụng chúng với mùa xuân và generics và bạn không quan tâm;)

Có mọi lúc mọi kết nối giữa các lớp! Để tách biệt chúng hoàn toàn có nghĩa là chúng không có sẵn sàng để giao tiếp (vì vậy chúng vô dụng).

Sử dụng các hoạt động CRUD cơ bản hoặc công cụ tìm động bất kỳ nơi nào nó có ý nghĩa ngữ nghĩa.

2

Tôi không nghĩ rằng bạn có thể có hai hoàn toàn tách biệt, nhưng bạn có thể đảm bảo rằng sự phụ thuộc không phải là hai chiều.

Tôi nghĩ rằng điều quan trọng là phải xác định một vài điều:

  1. đối tượng mô hình (ví dụ, Person, Địa chỉ, Đặt hàng, vv)
  2. lớp kiên trì (ví dụ, DAO, kho, vv)
  3. lớp dịch vụ (giao diện có phương pháp ánh xạ tới trường hợp sử dụng, biết về đơn vị công việc, v.v.)
  4. lớp web hoặc xem (bộ điều khiển/trang dành cho ứng dụng web, tiện ích cho máy tính để bàn).

Lớp kiên trì, dịch vụ và chế độ xem biết về các đối tượng mô hình; các đối tượng mô hình là không biết gì về lớp họ đang ở

Các phụ thuộc cho các lớp là một chiều và dòng chảy từ sau ra trước.

  • persistence-> mô hình
  • dịch vụ-> mô hình, kiên trì
  • xem-> mô hình, dịch vụ

Bạn thử nghiệm đơn vị từ trước ra sau, vì phụ thuộc giúp dễ dàng giả lập.

Không thể có phụ thuộc NO, nhưng bạn nên thiết kế chúng để không có chu kỳ.

Lớp duy nhất có không có phụ thuộc là phụ thuộc không ai gọi và không bao giờ gọi một lớp khác. Nó không hữu ích cũng không phải là một mục tiêu thiết kế đáng giá.

+0

Tôi không thấy "phân tách mối quan tâm" đối với câu hỏi của Nosredna. Tôi nghĩ rằng bài viết này sẽ làm sáng tỏ một số khái niệm và trợ giúp. Nice post, duffymo! –

0

n-tier desing: trong lớp logic nghiệp vụ, bạn có thể tạo lớp truy cập dữ liệu và lớp thao tác dữ liệu. luôn lập trình cho một giao diện.

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