Mô hình miền thiếu máu và tiêm dịch vụ miền


19

Các mô hình miền thiếu máu được mô tả như một chất chống pattern trong thiết kế miền do Martin Fowler. Để có logic nghiệp vụ trên các mô hình miền, các dịch vụ miền thường được sử dụng. Nhưng việc tiêm các dịch vụ miền vào các mô hình miền được coi là có hại bởi Vaughn Vernon (xem "Thực hiện thiết kế hướng tên miền, Trang 387).

Theo tôi những ý kiến ​​đó là mâu thuẫn, điều này có đúng không? Làm thế nào cả hai điểm có thể được xem xét?

Đây có phải là mô hình miền thực sự phong phú với các dịch vụ miền được tiêm so với mô hình miền thiếu máu và các dịch vụ miền bình thường không?


4
Tôi không có nghĩa là một chuyên gia về vấn đề này, nhưng tôi nghĩ rằng loại logic đi vào các dịch vụ miền và vào các thực thể miền là khác nhau về cơ bản. Logic đi vào Thực thể là logic cần thiết để giữ cho đối tượng ở trạng thái chính xác. Điều này liên quan đến xác nhận và chuyển đổi logic. Mặt khác, dịch vụ tên miền dành cho logic cấp cao hơn. Vì vậy, ví dụ, một dịch vụ miền sẽ mô hình hóa một quy trình kinh doanh liên quan đến nhiều loại thực thể khác nhau là những cách phức tạp.
MetaFight

2
@MetaFight: Ngay cả khi một quy trình kinh doanh ảnh hưởng đến nhiều thực thể theo những cách phức tạp, bạn có thể đạt được điều này mà không cần dịch vụ đưa ra một mô hình miền Aggregate Root tốt, nghĩa là một mô hình miền có quyền truy cập vào tất cả các thực thể bị ảnh hưởng dưới dạng các thuộc tính hoặc trường.
Greg Burghardt

Điều đó có ý nghĩa :)
MetaFight

Câu trả lời:


16

Một mô hình thiếu máu chỉ đơn giản là một thùng chứa dữ liệu. Nó không chứa hành vi. (Điều này thực sự có thể được coi là một điều tốt trong mô hình chức năng.) Ngược lại với một mô hình thiếu máu không phải là một mô hình được tiêm đầy đủ các dịch vụ miền. Bạn đang mô tả hai thái cực - cả hai đều xấu.

Nếu bạn có một mô hình thiếu máu, bạn không hoàn toàn chấp nhận những gì OOP cung cấp. Nếu bạn bắt đầu tiêm dịch vụ vào các mô hình đó, có khả năng bạn đang tiêm những lo ngại không thuộc về nơi đó. Hoặc là hoặc mô hình của bạn thiếu máu hơn bạn nghĩ. Tại sao bạn lại cần dịch vụ khác ngoài việc cung cấp thứ gì đó bắt buộc nhưng thiếu? (Thiếu có thể có nghĩa là thiếu máu.)

Tránh cả hai "kể" dẫn đến thiết kế mạnh mẽ hơn. Bạn có một cái gì đó trong một dịch vụ mà một người mẫu cần? Có lẽ nó nên được chuyển đến mô hình. Nếu không, có lẽ bạn nên xem xét lại mối quan tâm của bạn. Hành vi của một mô hình nên hoạt động bên trong mô hình. Nó nên chủ yếu (nếu không chỉ) quan tâm đến chính nó với các thành viên. Nhưng hãy nhớ rằng, sẽ vẫn có những điều mà công việc trên hoặc với mô hình. Ví dụ: các mô hình không nên mở kết nối TCP hoặc lắng nghe các sự kiện UI, ngay cả khi chúng có liên quan. Đó là trách nhiệm của người khác và rằng ai đó không bao giờ thuộc về bên trong mô hình.


7
Một điểm khác biệt tôi muốn nhớ là Mô hình miền của bạn triển khai logic nghiệp vụ và Dịch vụ miền của bạn thực thi logic nghiệp vụ trên Mô hình miền. Sự khác biệt là ai đang gọi ai. Các dịch vụ có thể gọi các phương thức Mô hình miền. Nếu Mô hình miền đang gọi các phương thức Dịch vụ, bạn đã lật mô hình trên đỉnh đầu.
Greg Burghardt

7

Nó không mâu thuẫn. Cả hai người đề xuất đều muốn bạn đặt mã thực tế của mình vào chính đối tượng miền.

I E.

public class Order
{
    private string status = "not bought";
    public void Buy()
    {
        this.status = "bought";
    }
}

đấu với ADM

public class Order
{
    public string Status = "not bought";
}

public class BuyingService
{
    public Order Buy(Order order)
    {
         Order o = new Order();
         o.status = "bought";
         return o;
    }
}

vs dịch vụ tiêm

public class Order
{
    public Order(IBuyingService bs)
    {
        _bs = bs;
    }
    private IbuyingService _bs;
    private string status = "not bought";
    public void Buy()
    {
        this.status = _bs.Buy();
    }
}

public class BuyingService : IBuyingService
{
    public string Buy()
    {
         return = "bought";
    }
}

Thẳng thắn mặc dù mỗi cách tiếp cận có điểm cộng và nhược điểm. Người bạn chọn phần lớn là vấn đề sở thích cá nhân

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.