Tôi đã đọc một số câu hỏi liên quan đến các mô hình miền thiếu máu và tách mối quan tâm. Các kỹ thuật tốt nhất để thực hiện/gắn logic miền trên các đối tượng miền thiếu máu là gì? Trong công việc của tôi, chúng tôi có một mô hình khá thiếu máu và chúng tôi hiện đang sử dụng các lớp "trợ giúp" để thực hiện cơ sở dữ liệu/logic nghiệp vụ trên các đối tượng miền. Ví dụ:Các kỹ thuật để xử lý mô hình miền thiếu máu
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
Khi ứng dụng cần mua hàng, nó sẽ tạo StoreHelper và gọi phương thức trên đối tượng miền. Với tôi, nó sẽ có ý nghĩa đối với Khách hàng/Sản phẩm để biết cách lưu chính nó vào một kho lưu trữ, nhưng có thể bạn sẽ không muốn các phương thức Save() trên các đối tượng miền. Nó cũng có ý nghĩa đối với một phương thức như Customer.Purchase (Product), nhưng đó là đặt logic miền trên thực thể.
Dưới đây là một số kỹ thuật tôi đã đi qua, không chắc chắn đó là tốt/xấu:
- khách hàng và sản phẩm kế thừa từ một lớp "Entity", cung cấp các hoạt động CRUD cơ bản trong một thời trang generic (sử dụng ORM có thể).
- Ưu điểm: Mỗi đối tượng dữ liệu sẽ tự động nhận được các thao tác CRUD, nhưng sau đó được gắn với cơ sở dữ liệu/ORM
- Nhược điểm: Điều này không giải quyết vấn đề của hoạt động kinh doanh trên các đối tượng, và cũng có thể gắn tất cả các đối tượng miền đến một Entity cơ sở có thể không thích hợp
- lớp Sử dụng helper để xử lý các hoạt động CRUD và logic kinh doanh
- Liệu nó làm cho tinh thần để có DAO cho "cơ sở dữ liệu thuần túy" hoạt động, và những người giúp đỡ kinh doanh riêng biệt cho họ hoạt động kinh doanh quặng cụ thể?
- Tốt hơn là nên sử dụng các lớp trợ giúp tĩnh hoặc tĩnh không?
- Ưu điểm: đối tượng miền không gắn với bất kỳ cơ sở dữ liệu/logic kinh doanh (hoàn toàn thiếu máu)
- Nhược điểm: không phải là rất OO, không phải là rất tự nhiên để sử dụng người giúp đỡ trong mã ứng dụng (trông giống như mã C)
- sử dụng các kỹ thuật đúp Dispatch nơi đơn vị có phương pháp để lưu vào một kho lưu trữ tùy ý
- Ưu điểm: tách tốt hơn các mối quan tâm
- Nhược điểm: thực thể có thêm một số logic kèm theo (mặc dù nó tách riêng)
- Trong C# 3.0, bạn có thể sử dụng phương pháp khuyến nông để đính kèm các phương pháp CRUD/kinh doanh cho một đối tượng miền mà không cần chạm vào nó
- Đây có phải là một cách tiếp cận hợp lệ? Ưu/nhược điểm là gì?
- Các kỹ thuật khác?
Kỹ thuật tốt nhất để xử lý vấn đề này là gì? Tôi khá mới với DDD (Tôi đang đọc cuốn sách của Evans - vì vậy có thể điều đó sẽ mở mắt của tôi)
Dường như rất nhiều lớp khác nhau chỉ để xử lý khách hàng. Tại sao không ném hầu hết trong một lớp duy nhất, với một dịch vụ để xử lý bất cứ điều gì phức tạp? –
Câu trả lời của tôi là cũ như địa ngục. : D –
@LuckyLindy Chủ yếu là do DDD sắp tạo cầu nối giữa các chuyên gia miền và lập trình viên. Mô hình miền không được chứa nội dung kỹ thuật, nếu không ngôn ngữ phổ biến sẽ không thể tồn tại. Để di chuyển các công cụ kỹ thuật - chúng ta phải trừu tượng nó. Tóm tắt một cái gì đó luôn luôn thổi phồng cơ sở mã. –