2011-11-23 21 views
12

Tôi đang cố gắng hiểu cách thức các thực thể hoạt động trong nhiều bối cảnh bị chặn.Thực thể trên các ngữ cảnh bị chặn trong Thiết kế theo hướng miền

Cho một nhân viên của một công ty. Trong (ví dụ) bối cảnh nguồn nhân lực, người này có tên, họ, địa chỉ, số tham chiếu tiền lương và tài khoản ngân hàng. Nhưng trong ngữ cảnh kế toán tất cả những gì có liên quan là số tham chiếu tiền lương và tài khoản ngân hàng.

Bạn có thực thể Nhân viên trong ngữ cảnh nhân sự và Loại giá trị (ví dụ: SalariedEmployee) trong ngữ cảnh kế toán không?

class Employee 
{ 
    public BankAccount BankAcountDetails { get; set; } 
    public string FullName { get; set; } 
    public Address ResidentialAddress { get; set; } 
    public string SalaryRef { get; set; } 
} 

SalariedEmployee lớp (??): Nhân viên chính của giá trị kiểu

class SalariedEmployee 
{ 
    public SalariedEmployee(string salaryRef, BankAccount bankAcountDetails) 
    { 
     ... 
    } 

    public string SalaryRef { get; } 
    public BankAccount BankAcountDetails { get; } 
} 

Liệu các HRService trong bối cảnh bị chặn trở lại thông tin này? Hay bạn sử dụng lớp Employee trong cả hai bối cảnh?

Trả lời

1

Tôi đoán tôi sẽ không sử dụng cùng một thực thể trong cả hai ngữ cảnh. Chúng được cho là bị ràng buộc. Điều gì sẽ xảy ra nếu tôi phải thay đổi lớp nhân viên của mình cho các nhu cầu của một bối cảnh? ... "bối cảnh bị ràng buộc" không bị ràng buộc nữa.

Tôi sẽ sử dụng đối tượng giá trị. Bí quyết là xác định đúng đối tượng giá trị. Tôi thấy chúng tương đương với đối tượng "Data Types", giống như một số nguyên là một số nguyên. Đây là thách thức tất nhiên (int16, int32 ...). Nhưng hãy giả sử đó là trường hợp. Là nhân viên một ứng cử viên tốt cho một đối tượng giá trị? .... Tôi không nghĩ như vậy: (... Bạn có thể không cần cùng một tập hợp các thông tin cho nhân viên trong bối cảnh bị ràng buộc.Trong một tên khác thông tin nhận dạng của nhân viên là một tốt hơn ứng cử viên (firstname, lastname, middlename ...) Điều này bạn có thể tái sử dụng trong bối cảnh bounded

Bây giờ lớp dịch vụ sẽ trả về đối tượng giá trị này? ... Personnaly Tôi sẽ không làm điều đó. tái sử dụng theo quy định tại các kho của tôi. ánh xạ Sharing trong Nhibernate hoặc chia sẻ cùng lớp chiếu/mapper.

Hope this helps :)

2

Nếu có nhiều ngữ cảnh là cần thiết, chắc chắn một số thứ có thể được mô hình hóa như một thực thể trong một số ngữ cảnh và một đối tượng giá trị trong một ngữ cảnh khác. Dịch từ một thực thể sang một đối tượng giá trị thường đơn giản, nhưng từ một đối tượng giá trị cho một thực thể có thể không đơn giản như vậy. Từ Domain Driven Design, tr. 337:

Cơ chế dịch không được thúc đẩy bởi mô hình. Báo cáo không nằm trong ngữ cảnh bị giới hạn ở . (Nó là một phần của ranh giới riêng của mình, mà sẽ được thảo luận trong bản đồ ngữ cảnh.)

Nếu bối cảnh nguồn nhân lực bao giờ cần phải hỏi bối cảnh kế toán một câu hỏi về một nhân viên đặc biệt, nó sẽ trở thành một câu hỏi khó hiểu .

+0

Bạn có nói rằng ví dụ tôi đưa ra ở trên là một ý tưởng hay là nó được "cho phép" và phổ biến trong DDD? – Asher

+1

Đó là một ý tưởng hay. Nó làm cho nó rất rõ ràng rằng bối cảnh kế toán không phân biệt giữa các nhân viên hưởng lương như xa như bất kỳ logic kinh doanh có liên quan. Bạn chỉ cần cảm thấy tự tin rằng ngữ cảnh kế toán sẽ không bao giờ cần phân biệt chúng. –

3

Nếu họ nghiêm chỉnh riêng biệt, tôi sẽ làm cho họ cách rất lớn. Hai lớp khác nhau trong các không gian tên khác nhau. Mỗi thuộc tính khác nhau.

Nếu nhân sự tạo HRM.Employee, một sự kiện có thể được nêu ra rằng Accounting chọn và tạo một Accounting.Employee.

12

Từ http://msdn.microsoft.com/en-us/library/jj554200.aspx:

Bounded ngữ cảnh là những thành phần tự trị, với các mô hình miền riêng của họ và ngôn ngữ phổ biến của riêng mình. Họ không nên có bất kỳ sự phụ thuộc vào nhau trong thời gian chạy và nên có khả năng chạy trong sự cô lập. Tuy nhiên, chúng là một phần của cùng một hệ thống tổng thể và cần trao đổi dữ liệu với nhau.

Nếu bạn đang thực hiện CQRS pattern trong bối cảnh bị chặn, bạn nên sử dụng sự kiện cho loại hình truyền thông này: bối cảnh giáp của bạn có thể đáp ứng với sự kiện được nêu ra bên ngoài bối cảnh bị chặn, và bối cảnh giáp của bạn có thể xuất bản các sự kiện các ngữ cảnh bị ràng buộc khác có thể đăng ký. Sự kiện (thông báo một chiều, không đồng bộ xuất bản thông tin về một cái gì đó đã xảy ra), cho phép bạn duy trì khớp nối lỏng lẻo giữa các ngữ cảnh bị chặn của bạn.

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