2010-11-10 23 views
5

Tôi đã làm việc với DDD được vài tháng và tôi đã gặp một vài điều mà tôi không chắc chắn.Ví dụ nào trong số này đại diện cho việc sử dụng DDD đúng cách?

Lấy ví dụ đơn giản về việc thêm Product vào đối tượng Order. Từ Bộ điều khiển của chúng tôi, chúng tôi sẽ có một số int được truyền qua giao diện người dùng đại diện cho một số Product trong cơ sở dữ liệu. Ví dụ nào trong hai ví dụ sau là đúng (cho tôi biết nếu cả hai đều sai)?

Ví dụ Một:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     Product product = _productRepository.GetProduct(productId); 
     order.AddProduct(product); 
    } 
} 

Controller instantiates sản phẩm riêng của mình và bổ sung nó trong qua phương pháp:

void AddProduct(Product product) 
{ 
    productList.Add(product); 
} 

Ví dụ thứ hai:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     order.AddProduct(productId, _productRepository); 
    } 
} 

Các Order mô hình miền có kho sản phẩm tiêm truyền cho nó và nó được các sản phẩm và thêm nó:

Product AddProduct(int productId, IProductRepository productRepository) 
{ 
    Product product = productRepository.GetProduct(productId); 
    productList.Add(product); 

    return product; 
} 

Tôi hiện đã đi cho ví dụ đầu tiên, bởi vì Domain Model của bạn không bao giờ nên gọi một phương thức dịch vụ trong nội bộ, tuy nhiên Tôi đã nhìn thấy một vài ví dụ gần đây mà sử dụng ví dụ thứ hai của tôi và nó trông gọn gàng. Dường như với tôi rằng Ví dụ Một đang hợp nhất trên Đại dịch. Ví dụ Hai sẽ di chuyển tất cả logic Thêm sản phẩm vào chính Mô hình miền.

+0

Có vẻ như ví dụ đầu tiên sẽ dẫn đến thiết kế theo hướng tải dữ liệu tham lam và thứ hai hướng tới tải chậm. Bạn thích cái nào trong số này? –

+0

Đơn đặt hàng của bạn được lưu như thế nào sau khi sản phẩm được thêm vào danh sách trong bộ nhớ? Có một số phép thuật xảy ra (xin lỗi tôi không biết C# có thể đối tượng Order là một proxy được quản lý bởi một framework không?) –

Trả lời

2

một Thứ hai là khủng khiếp ...

Thêm một sản phẩm để đặt hàng không cần phải có kho lưu trữ trên chữ ký kể từ kho lưu trữ không phải là một phần của tên miền.

Tôi có xu hướng đi đầu tiên.

+0

Trên thực tế Kho lưu trữ ** Giao diện ** là một phần của miền. Việc triển khai cụ thể là một phần của Cơ sở hạ tầng miền: http://dddsample.sourceforge.net/architecture.html – GenericTypeTea

+0

Khi bạn đi đến siêu thị và nhận một mục và thêm vào xe đẩy của bạn, bạn có chỉ định một kho lưu trữ không? Có kho lưu trữ có thể được coi là một phần của miền cơ sở hạ tầng nhưng không phải miền kinh doanh. – Aliostad

+0

Không, tôi quá bận rộn khi triển khai 'IWheel'. Nhưng tôi thích ví dụ của bạn :). Tôi đã nghĩ rằng nó trông kỳ lạ; nó làm cho mọi thứ gọn gàng hơn nhưng dường như nó không đáp ứng được các quy tắc khi tôi hiểu chúng. – GenericTypeTea

1

Vâng bạn thân là người đầu tiên là tốt hơn ...

Như nếu chúng ta nghĩ theo hình thức của các đối tượng ...

Thêm sản phẩm vào danh sách không có gì để làm với các kho sản phẩm, nó nên chỉ lấy sản phẩm.

+0

sản xuất thực sự là sản phẩm, đó là lỗi chính tả – Genius

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