2010-01-19 111 views
5

Vì vậy, tôi có DAO, DTO và BO. Mã sau đây là kết quả:Tách mối quan tâm - DAO, DTO và BO

// Instantiate a new user repository. 
UserRepository rep = new UserRepository(); 

// Retrieve user by ID (returns DTO) and convert to business object. 
User user = rep.GetById(32).ToBusiness<User>(); 

// Perform business logic. 
user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

// Convert business object back to a DTO to save to the database. 
rep.Save(user.ToDataTransfer<Data.DTO.User>()); 

Vì vậy, tôi đang cố tách riêng các mối quan tâm, nhưng tôi muốn loại bỏ "chuyển đổi" trong mã này. "Chuyển đổi" thực sự nằm trong lớp logic nghiệp vụ (lớp DTO không biết gì về lớp logic nghiệp vụ) như một đối tượng mở rộng. DTO chính nó rõ ràng chỉ lưu trữ dữ liệu và không có logic kinh doanh những gì-so-bao giờ hết. UserRepository gọi DAO và vào cuối GetById sử dụng AutoMapper để ánh xạ từ DAO đến DTO. Các "chuyển đổi" (ToBusiness và ToDataTransfer) làm chính xác như họ nói.

Một đồng nghiệp của tôi nghĩ rằng tôi có thể phải có một Kho lưu trữ kinh doanh, nhưng nghĩ rằng nó có thể là một chút clunky. Có suy nghĩ gì không?

Trả lời

3

tôi giải quyết điều này bằng cách tạo ra một lớp dịch vụ kinh doanh. Bằng cách này, tôi có thể truy cập chức năng thông qua lớp Dịch vụ doanh nghiệp mà lần lượt sử dụng các kho lưu trữ truy vấn DAL và trả về DTO. Các DTO phục vụ mục đích của chúng bằng cách được phổ biến bởi DAL và giúp chuyển dữ liệu đến lớp nghiệp vụ (được chuyển đổi thành các đối tượng nghiệp vụ).

Vì vậy, các sơ đồ như sau:

Dal -> Repository (trả DTO) -> Dịch vụ (trả BO)

Nó hoạt động rất tốt và tôi có thể đặt logic kinh doanh trong lớp dịch vụ nó tóm tắt nó từ chính Kho lưu trữ. Mã mẫu:

// UserService uses UserRepository internally + any additional business logic. 
var service = new UserService(); 
var user = service.GetById(32); 

user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

service.Save(user); 
1

Đây là lần đầu tiên tôi thấy DTO được chuyển thành BO, tôi thường gửi một DTO được tiêu thụ bởi một lớp hoặc phương thức BO. Khi BO được thực hiện và muốn lưu các sửa đổi đối với DTO, nó sẽ gửi nó đến DAL và nó vẫn tồn tại.

+0

Cảm ơn câu trả lời của bạn. Bất kỳ mã mẫu nào bạn có thể cung cấp đều hữu ích. –

+0

Tôi đồng ý với điều này. Bạn nên lấy lại đối tượng kinh doanh của mình và nếu bạn cần chuyển đổi sang DTO thì chuyển đổi đó có thể xảy ra với một công cụ như AutoMapper. –

8

Nguồn gây nhầm lẫn duy nhất của tôi ở đây là lý do tại sao các cuộc gọi đến ToBusiness<User>()ToDataTransfer<Data.DTO.User>() là cần thiết.

Trách nhiệm của Kho lưu trữ là xử lý việc quản lý dữ liệu. Nó sẽ ẩn các chi tiết thực hiện (cũng như các chuyển đổi giữa các đối tượng kinh doanh và các đối tượng dữ liệu).

A UserRepository phải trả lại User mà không cần bất kỳ thao tác đúc nào.

UserRepository cũng phải có thể tồn tại User mà không cần truyền.

Mã sẽ được sạch hơn nhiều nếu tất cả các đúc được xử lý trong Repository và mã của bạn đọc như:

UserRepository rep = new UserRepository(); 

User user = rep.GetById(32); 

// Do Work Here 

rep.Save(user); 
+1

Bạn đang đề xuất không có đối tượng DTO và bỏ qua quyền đối tượng kinh doanh? lại: Mã trình dọn dẹp- Tôi hoàn toàn đồng ý - đây là những gì tôi đang cố gắng sử dụng những mối quan ngại đó. –

+0

Hãy sửa tôi nếu tôi sai ở đây Justin, nhưng tôi không nghĩ Justin đang đề xuất không có DTO, mà đúng hơn là gợi ý giấu nó đi.Kho lưu trữ sẽ gọi các phương thức chuyển đổi giữa DTO và BO để trong khi bạn đang lập trình chức năng kinh doanh bình thường, bạn sẽ không bao giờ phải xem hoặc biết về DTO. – rayd09

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