Rễ tổng hợp là gì?


447

Tôi đang cố gắng tìm hiểu cách sử dụng đúng mẫu kho lưu trữ. Khái niệm trung tâm của một gốc tổng hợp tiếp tục được đưa ra. Khi tìm kiếm cả web và Stack Overflow để tìm trợ giúp về gốc tổng hợp là gì, tôi tiếp tục tìm các cuộc thảo luận về chúng và các liên kết chết đến các trang được cho là chứa các định nghĩa cơ sở.

Trong ngữ cảnh của mẫu kho lưu trữ, một gốc tổng hợp là gì?


16
Xem xét xem xét các nghiên cứu trường hợp sau đây. Thiết kế hiệu quả tổng hợp Phần I: Mô hình hóa một đơn tổng hợp dddcommunity.org/wp-content/uploads/files/pdf_articles/... Phần II: Làm Uẩn làm việc cùng nhau dddcommunity.org/wp-content/uploads/files/pdf_articles/... Phần III: đạt Cái nhìn sâu sắc Qua Discovery dddcommunity.org/wp-content/uploads/files/pdf_articles/...
Bến Vitale

Câu trả lời:


310

Trong ngữ cảnh của mẫu kho lưu trữ, các gốc tổng hợp là các đối tượng duy nhất mà mã máy khách của bạn tải từ kho lưu trữ.

Kho lưu trữ đóng gói quyền truy cập vào các đối tượng con - từ phối cảnh của người gọi, nó sẽ tự động tải chúng, đồng thời root được tải hoặc khi chúng thực sự cần thiết (như với tải lười biếng).

Ví dụ: bạn có thể có một Orderđối tượng đóng gói các hoạt động trên nhiều LineItemđối tượng. Mã khách hàng của bạn sẽ không bao giờ tải các LineItemđối tượng trực tiếp, chỉ Ordercó chứa các đối tượng đó, đó sẽ là gốc tổng hợp cho phần đó trong miền của bạn.


21
Theo giả thuyết, nếu mã máy khách cần LineItem cho một số mục đích khác, liệu nó có tạo thành một tập hợp riêng biệt (giả sử sẽ có các đối tượng khác liên quan không liên quan đến đối tượng Đặt hàng) không?
Ahmad

20
@Ahmad, các tập hợp khác có thể coi LineItems là dữ liệu chỉ đọc, họ không thể thay đổi chúng. Nếu các tổng hợp khác có thể thay đổi chúng, bạn không thể bảo vệ các bất biến của đơn hàng (cũng như các chi tiết đơn hàng ').
Jeff Sternal

4
Hãy xem điều này, ví dụ như Lostechies.com/bloss/jimmy_bogard/archive/2010/02/23/ . Trong ví dụ, Khách hàng là một bất biến của Đặt hàng, phải không? Tuy nhiên, Khách hàng cũng có thể là một gốc tổng hợp khác? Hay tôi đang thiếu một số hiểu biết cơ bản ở đây?
Ahmad

3
@Jeff Bạn đã nói "họ chỉ không thể thay đổi chúng" - điều đó có thể thi hành được hay là vấn đề quy ước?
Neil Barnwell

4
@Neil: Tôi sẽ thực thi nó bằng bất kỳ cơ chế ngôn ngữ nào có sẵn - ví dụ, bằng cách tạo một lớp không thay đổi để biểu diễn dữ liệu.
Jeff Sternal

206

Từ Evans DDD:

AGGREGATE là một cụm các đối tượng liên quan mà chúng ta coi là một đơn vị cho mục đích thay đổi dữ liệu. Mỗi AGGREGATE có một gốc và một ranh giới. Ranh giới xác định những gì bên trong AGGREGATE. Root là một ENTITY duy nhất, cụ thể có trong AGGREGATE.

Và:

Root là thành viên duy nhất của AGGREGATE mà các đối tượng bên ngoài được phép giữ các tham chiếu đến [.]

Điều này có nghĩa là các gốc tổng hợp là các đối tượng duy nhất có thể được tải từ kho lưu trữ.

Một ví dụ là một mô hình chứa một Customerthực thể và một Addressthực thể. Chúng tôi sẽ không bao giờ truy cập một Addressthực thể trực tiếp từ mô hình vì nó không có ý nghĩa nếu không có bối cảnh của một liên kết Customer. Vì vậy, chúng ta có thể nói rằng CustomerAddresscùng nhau tạo thành một tổng hợp và đó Customerlà một gốc tổng hợp.


57
Cập nhật từ Eric Evans : nhấn mạnh rằng các gốc tổng hợp là ranh giới nhất quán cho các giao dịch / đồng thời và cho rằng các thực thể bên ngoài không thể giữ các tham chiếu đến các thực thể con của tổng hợp khác.
Brian Low

3
Vì vậy, verbiage là mãi mãi làm tôi bối rối. Each AGGREGATE has a rootThe root is the only *member* of the AGGREGATE- verbage này ngụ ý rằng gốc là thuộc tính trên Uẩn. Nhưng trong tất cả các ví dụ, đó là một cách khác: gốc chứa các thuộc tính là tập hợp. Bạn có thể làm rõ?
Tạp chí Sina

1
Chỉ cần làm cho ngôn ngữ của tôi đúng, Customerlớp được coi là gốc tổng hợp, hoặc các Customer trường hợp ?
Joe

1
Nói chung, trong mô hình chi tiết đơn hàng của khách hàng, Khách hàng sẽ là Tổng hợp gốc. Trường hợp của một khách hàng sẽ là một ví dụ của Root tổng hợp đó. Khi nói về một Root tổng hợp được gọi là Khách hàng, bạn đang thảo luận về việc xây dựng logic của một Khách hàng tạo nên thể hiện của một khách hàng. Một bộ sưu tập của Khách hàng chỉ là một bộ sưu tập.
Ibrahim Malluf

111

Root tổng hợp là một tên phức tạp cho ý tưởng đơn giản.


Ý tưởng chung

Sơ đồ lớp được thiết kế tốt đóng gói nội bộ của nó. Điểm thông qua đó bạn truy cập cấu trúc này được gọi là aggregate root.

nhập mô tả hình ảnh ở đây

Nội bộ của giải pháp của bạn có thể rất phức tạp, nhưng người dùng của hệ thống phân cấp này sẽ chỉ sử dụng root.doSomethingWhichHasBusinessMeaning().


Thí dụ

Kiểm tra hệ thống phân cấp lớp đơn giản này nhập mô tả hình ảnh ở đây

Bạn muốn đi xe như thế nào? Chọn api tốt hơn

Tùy chọn A (nó chỉ hoạt động bằng cách nào đó):

car.ride();

Tùy chọn B (người dùng có quyền truy cập vào nội bộ lớp):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

Nếu bạn nghĩ rằng lựa chọn A tốt hơn thì xin chúc mừng. Bạn có được lý do chính đằng sau aggregate root.


Tổng hợp gốc đóng gói nhiều lớp. bạn có thể thao tác toàn bộ hệ thống phân cấp chỉ thông qua đối tượng chính.


17
Tôi thích ví dụ này, nhưng tôi đang loay hoay tìm một kịch bản trong đó Khách hàng nên tham khảo Engine. Có vẻ như Engine nên được gói gọn phía sau Xe. Bạn có thể giải thích một chút về điều này?
emragins

Theo tôi, động cơ phải nằm trong một mẫu xe cụ thể, ví dụ BMW series 5 với động cơ 3000cc. Với mô hình này, động cơ là một thành phần cho một chiếc xe hơi.
Parama Dharmika

1
@ParamaDharmika chắc chắn, bạn có thể mô hình hóa nó theo cách đó. Điều đó phụ thuộc vào mức độ 'tiên tiến' với ô tô là khách hàng của bạn. Trong mô hình cơ bản, anh ta nên có quyền truy cập vào cartổng hợp gốc. Bạn cũng có thể cho phép tình huống như một trên bản vẽ. Giải pháp đúng phụ thuộc vào mô hình kinh doanh của ứng dụng. Nó có thể khác nhau trong từng trường hợp.
Marcin Szymczak

1
@MarcinSzymczak đúng, không thể đồng ý thêm rằng giải pháp đó phụ thuộc vào chính mô hình miền
Parama Dharmika

Trên thực tế, các bánh xe là một tổng hợp có chứa lốp (và các bộ phận khác). Nếu quy tắc của bạn yêu cầu tổng hợp Bánh xe chỉ có thể được truy cập thông qua Tổng hợp gốc xe, thì động cơ cũng được chứa trong Tổng hợp gốc xe và không được truy cập bên ngoài Xe. Đó là trong vương quốc của một chiếc xe. Chủ xe (Khách hàng) sẽ không tham khảo động cơ trừ trường hợp xe của anh ấy / cô ấy.
Ibrahim Malluf

35

Hãy tưởng tượng bạn có một thực thể Máy tính, thực thể này cũng không thể sống mà không có thực thể Phần cứng và thực thể Phần cứng. Chúng tạo thành Computertổng hợp, hệ sinh thái nhỏ cho phần Máy tính của miền.

Root tổng hợp là thực thể mẹ trong tập hợp (trong trường hợp của chúng tôi Computer), một cách thông thường là kho lưu trữ của bạn chỉ hoạt động với các thực thể là Rễ tổng hợp và thực thể này chịu trách nhiệm khởi tạo các thực thể khác.

Xem xét Tổng hợp gốc như một điểm nhập cảnh cho một Tổng hợp.

Trong mã C #:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

Hãy nhớ rằng Phần cứng cũng có thể là một ValueObject (không có bản sắc riêng), chỉ xem xét nó như một ví dụ.


6
where T : IAggregateRoot- Điều này làm cho ngày của tôi
Cristian E.

Từ ngữ này hơi mâu thuẫn, tôi nghĩ và đây là điều khiến tôi bối rối khi cố gắng học điều này. Bạn đang nói rằng Máy tính là tổng hợp, nhưng sau đó bạn đang nói rằng gốc sẽ là thực thể làm mẹ bên trong tổng hợp. Vì vậy, cái nào là thực thể "làm mẹ" trong tổng hợp trong ví dụ này?
Sina 18/03/2016

Chúc mừng từ tương lai!. Điều anh chàng muốn nói là chính Máy tính là gốc tổng hợp, trong khi máy tính VÀ mọi thứ bên trong nó là tổng hợp. Hay nói rõ hơn: trường hợp tự nó là gốc tổng hợp, trong khi toàn bộ máy tính là tổng hợp (tập hợp tất cả mọi thứ tạo nên "máy tính, ví dụ như ánh sáng RGB, Phần cứng, Cung cấp năng lượng, HĐH, v.v.)
Thuyền trưởng Kenpachi

Kỹ thuật IAggregateRoot xuất hiện trong tài liệu của Microsoft: docs.microsoft.com/en-us/dotnet/arch architecture / microervice / //
Samuel Danielson

16

Nếu bạn làm theo cách tiếp cận cơ sở dữ liệu đầu tiên, bạn tổng hợp gốc thường là bảng ở phía 1 của mối quan hệ 1-nhiều.

Ví dụ phổ biến nhất là một người. Mỗi người có nhiều địa chỉ, một hoặc nhiều phiếu thanh toán, hóa đơn, mục nhập CRM, v.v. Không phải lúc nào cũng như vậy, nhưng 9/10 lần là như vậy.

Chúng tôi hiện đang làm việc trên một nền tảng thương mại điện tử, và chúng tôi về cơ bản có hai nguồn gốc tổng hợp:

  1. Khách hàng
  2. Người bán

Khách hàng cung cấp thông tin liên hệ, chúng ta gán các giao dịch với họ, giao dịch được mục hàng vv

Người bán bán sản phẩm, có người liên hệ, trang về chúng tôi, ưu đãi đặc biệt, v.v.

Chúng được chăm sóc bởi kho lưu trữ của Khách hàng và Người bán tương ứng.


8
Nếu bạn làm theo cách tiếp cận cơ sở dữ liệu đầu tiên thì bạn không thực hành Thiết kế hướng miền, bạn đang theo Thiết kế hướng dữ liệu.
Trang web thẩm mỹ

5
Đó là một diễn đàn Hỏi & Đáp nơi mọi người đến để giải quyết vấn đề và / hoặc tìm hiểu - Đó không phải là tôi chọc bạn. Theo định nghĩa, DDD là một suy nghĩ nhiều hơn bất cứ điều gì khác và nó gây nhầm lẫn cho nhiều người, vì vậy tôi đảm bảo rằng nhận xét được đưa ra cho những người đang học DDD trong nỗ lực giúp giảm thiểu bất kỳ sự kết hợp tiềm năng nào của phương pháp thiết kế.
Sinaesthetic

12

Dinah:

Trong bối cảnh của một kho lưu trữ, gốc tổng hợp là một thực thể không có thực thể cha. Nó chứa không, Một hoặc nhiều Thực thể Trẻ em có sự tồn tại phụ thuộc vào Cha mẹ cho danh tính của nó. Đó là mối quan hệ Một đến Nhiều trong Kho lưu trữ. Những thực thể trẻ em đó là Uẩn đồng bằng.

nhập mô tả hình ảnh ở đây


1
Vì vậy, nếu bạn là một người bán xe hơi, thì Xe sẽ là một gốc tổng hợp phải không? Bởi vì bạn có thể có nhiều xe chưa có khách hàng
JorgeeFG

2
@JorgeeFG câu trả lời thực sự là không ai có bất kỳ manh mối nào cả. Có rất nhiều thông tin mâu thuẫn rải rác xung quanh.
Mardoxx

3
Các thực thể con không phải là tổng hợp, chúng chỉ là các thực thể tình cờ là thành viên của tổng hợp trong đó các điều khiển gốc tổng hợp. Một "tổng hợp" là một nhóm các thực thể hợp lý .
Sinaesthetic

@JorgeeFG nó thực sự phụ thuộc vào bối cảnh giới hạn mà bạn đang thiết kế. Nếu bạn là người bán xe hơi, thì thứ gì đó như Carshop sẽ trở thành gốc tổng hợp, và bên dưới nó đi theo Ô tô ...
jokab

8

Từ một liên kết bị hỏng :

Trong một Uẩn có một Cốt liệu gốc. Root tổng hợp là thực thể mẹ cho tất cả các thực thể và đối tượng giá trị khác trong tập hợp.

Một kho lưu trữ hoạt động trên một gốc tổng hợp.

Thêm thông tin cũng có thể được tìm thấy ở đây .


4
Cảm ơn bạn. Đó chắc chắn là liên kết bị hỏng phổ biến và bực bội nhất mà tôi liên tục chạy qua.
Dinah

Ngoài ra, từ ngữ có vẻ ngược. Làm thế nào gốc có thể nằm trong aggreate và là cha mẹ cùng một lúc?
Tạp chí Sina

1
Root tổng hợp là lớp gốc. Một tập hợp đơn giản luôn được chứa trong một tập hợp gốc. Sử dụng Sơ đồ được đặt ở trên ... Khách hàng là Tổng hợp gốc. Khách hàng có thể sở hữu một hoặc nhiều xe. Ô tô là Uẩn liên quan đến Khách hàng. Ô tô có Động cơ. Động cơ là một Uẩn chứa trong Cốt liệu ô tô. Điều khiến Khách hàng trở thành một Tổng hợp gốc là giả định của mô hình rằng việc truy cập vào xe hơi hoặc các bộ phận của nó luôn thông qua khách hàng sở hữu xe.
Ibrahim Malluf

8

Tổng hợp có nghĩa là bộ sưu tập của một cái gì đó.
root giống như nút trên cùng của cây, từ đó chúng ta có thể truy cập mọi thứ như <html>nút trong tài liệu trang web.
Blog Analogy, Một người dùng có thể có nhiều bài đăng và mỗi bài đăng có thể có nhiều bình luận. Vì vậy, nếu chúng tôi tìm nạp bất kỳ người dùng nào thì nó có thể đóng vai trò là root để truy cập tất cả các bài đăng liên quan và nhận xét thêm về các bài đăng đó. Đây là tất cả cùng nhau được cho là bộ sưu tập hoặc Tổng hợp


1

Uẩn là nơi bạn bảo vệ sự bất biến và lực lượng nhất quán của mình bằng cách giới hạn quyền truy cập tổng hợp tư tưởng truy cập của nó. Đừng quên, tổng hợp nên thiết kế theo các quy tắc và bất biến kinh doanh dự án của bạn, chứ không phải mối quan hệ cơ sở dữ liệu. bạn không nên tiêm bất kỳ kho lưu trữ nào và không được phép truy vấ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.