2012-01-20 27 views

Trả lời

8

Cá nhân, tôi không thích nhìn thấy kho lưu trữ trong bộ điều khiển hoặc trong lớp trình bày nói chung. Nhưng tôi đã nhìn thấy nó nhiều lần và không có gì sai với nó trong bối cảnh DDD.

Tôi nghĩ câu trả lời là tùy thuộc vào dự án của bạn lớn đến mức nào. Một lớp dịch vụ thường được tìm thấy trong các dự án phức tạp hơn. Trong khi đó, các trang web MVC đơn giản hơn chỉ sử dụng trực tiếp kho lưu trữ.

+1

"Tôi không thích nhìn thấy kho lưu trữ trong bộ điều khiển" => bạn có thể giải thích lý do tại sao và lớp trung gian nào bạn thêm vào giữa bộ điều khiển và kho lưu trữ không? – guillaume31

+1

Bộ điều khiển có xu hướng bị cồng kềnh rất nhanh. Một trong những lý do cho điều này là bởi vì devs cuối cùng gắn bó logic kinh doanh trong bộ điều khiển của họ. Logic nghiệp vụ chỉ nên sống trong lớp miền chủ yếu, và sau đó trong lớp dịch vụ - không phải trong bộ điều khiển và không nằm trong kho lưu trữ. Bằng cách sử dụng một (Ứng dụng) Dịch vụ trong bộ điều khiển của bạn, bạn tránh điều này. Vì vậy, ví dụ bạn sẽ gọi accountService.GetUserByEmail (email) hoặc catalogueService.GetProductViewModel. Bộ điều khiển của bạn vẫn tốt đẹp và gọn gàng và dịch vụ ứng dụng của bạn tọa độ nói chuyện với các kho lưu trữ khác nhau. – autonomatt

+3

Chỉ vì bạn nhận được một đối tượng từ một kho lưu trữ không có nghĩa là bạn xử lý trong logic nghiệp vụ. Nó chỉ là về * nhận được đối tượng trên * từ lớp miền được sử dụng trong một lớp khác. Và tôi không thể thấy cách một userRepository.GetUserByEmail (email) một dòng đơn giản hóa bộ điều khiển nhiều hơn accountService.GetUserByEmail (email). – guillaume31

2

Hoặc tôi có thể sử dụng kho lưu trữ trực tiếp để lấy đối tượng miền không?

Bạn chắc chắn có thể. Đó chính xác là mục tiêu của kho. Tôi tự hỏi loại dịch vụ nào bạn sẽ sử dụng cho điều đó (ngoại trừ trong bối cảnh cụ thể của kiến ​​trúc dựa trên SOA hoặc dịch vụ web).

+0

Câu hỏi (dự định) của tôi là nếu tôi có thể bỏ qua dịch vụ và lấy thực thể miền trực tiếp từ kho (ví dụ trong bộ điều khiển MVC) – jgauffin

+0

Tôi hiểu đúng và câu trả lời là có :) Thật buồn cười khi thấy điều gì đó được xem là hoàn hảo bình thường và phổ biến nếu bạn nhìn vào cuốn sách DDD gốc và phong trào bây giờ dường như làm mọi người sợ hãi ... – guillaume31

+0

Tôi không sợ. Tôi chỉ muốn biết thực hành tốt nhất là gì. Cuốn sách đã được phát hành chín năm trước và có thể đã xảy ra một hoặc hai điều kể từ đó .. – jgauffin

0

Sau khi hoàn thành dự án đầu tiên của tôi được cấu trúc bằng nguyên tắc DDD: D, tôi thấy hữu ích khi có cả dịch vụ miền và kho lưu trữ có sẵn cho lớp ứng dụng để sử dụng.

ĐIỂM CHÍNH: Lớp ứng dụng có thể là dịch vụ WCF của bạn hoặc mã trong dịch vụ web của bạn nếu bạn đang sử dụng kiến ​​trúc đó. Tất cả phụ thuộc vào việc triển khai của bạn. Nếu nó phù hợp với việc thực hiện của bạn, lớp ứng dụng của bạn có thể giống như lớp trình bày của bạn, do đó có mã lớp ứng dụng trong các trình theo dõi của bạn hoặc mã biểu mẫu web phía sau.

Chức năng kho lưu trữ như bộ sưu tập trong bộ nhớ. Đối với lớp ứng dụng, mã sẽ giống như bạn đang sử dụng bất kỳ bộ sưu tập cũ nào.

Dịch vụ miền hoạt động giống như bộ xử lý hoặc người truy cập thông tin sẽ không bao giờ được cập nhật, có thể được xử lý nhưng không được cập nhật trực tiếp. Đối với lớp ứng dụng, mã sẽ giống như bạn đang sử dụng bất kỳ dịch vụ web cũ nào.

Điều đó đang được nói, tôi sẽ giải thích thêm với một số ví dụ:

Repositories

kho của tôi thực sự kế thừa từ một bộ sưu tập chung đánh máy với một đối tượng thực hiện Tôi tạo ra mà đóng gói chìa khóa cơ sở dữ liệu và công việc kinh doanh mô hình cùng nhau. Sử dụng phương pháp này, tôi có thể xác định một indexer trong giao diện của tôi như

BusinessObject this[int index]; 

và tôi có thể có một getter rằng sẽ trả lại đối tượng kinh doanh dựa trên các chỉ số của bộ sưu tập cơ bản và một setter mà sẽ tra cứu phím dữ liệu từ bộ sưu tập cơ bản và lưu đối tượng vào cơ sở dữ liệu. Điều này làm cho mã ứng dụng cực kỳ đơn giản, ví dụ

IBusinessObjectRepository repository = new SqlBusinessObjectRepository(sqlString); 
BusinessObject obj = repository[0]; //Get first object in the list. 
//Make some changes to the business object by setting properties or calling methods to process business logic. 
repository[0] = obj; //Save the object back to the database. 

Dịch vụ

Tôi sử dụng dịch vụ để lấy danh sách các đơn vị và các đối tượng giá trị mà tôi sẽ không để chỉnh sửa riêng rẽ và, trong trường hợp của tôi, là chỉ được sử dụng như các lựa chọn hoặc giá trị có sẵn khi gọi các phương thức trên gốc tổng hợp.Nói chung, tôi lưu trữ thông tin này trên máy chủ web. Đây không phải là chỉ sử dụng cho một dịch vụ tên miền, chỉ là ví dụ của tôi. Mã lớp ứng dụng vẫn còn tương đối đơn giản.

IBusinessService service = new ImplBusinessService(implementationArgs); 
List<BusinessObject> objsToCache = service.GetBusinessObjects(); 
//cache the objects on the web server. 

Kết luận và hiểu biết về nguyên tắc DDD, lớp ứng dụng có thể truy cập các đối tượng kinh doanh từ dịch vụ hoặc kho lưu trữ. Sự lựa chọn giữa chúng đi xuống đến những gì phù hợp nhất trong mô hình miền.

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