Объекты в ограниченных контекстах в проекте, управляемом доменами

Я пытаюсь понять, как объекты работают в нескольких ограниченных контекстах.

Предоставлено сотрудником компании. В (например) контексте Human Resources этот человек имеет имя, фамилию, адрес, ссылочный номер зарплаты и банковский счет. Но в контексте учета все, что имеет значение, - это ссылочный номер зарплаты и банковский счет.

У вас есть объект Employee в контексте HR и тип значения (например, SalariedEmployee) в контексте учета?

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

SalariedEmployee class (??): Тип значения сотрудника

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

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

Возвращает ли HRService в ограниченном контексте эту информацию? Или вы используете класс Employee в обоих контекстах?

Ответ 1

Думаю, я бы не использовал один и тот же объект в обоих контекстах. Они должны быть ограничены. Что делать, если мне нужно изменить класс сотрудника для нужд одного контекста?... "Предполагаемый ограниченный контекст" больше не ограничен.

Я бы использовал объект value. Трюк состоит в том, чтобы правильно определить объект значения. Я вижу, что они эквивалентны объекту "Типы данных", например целое число. Конечно, это бросает вызов (int16, int32...). Но пусть это так. Является ли Employee хорошим кандидатом для объекта ценности?.... Я так не думаю: (... Вам может не понадобиться такой же набор информации для Employee в ограниченном контексте. В другом имени идентификационная информация сотрудника является лучший кандидат (firstname, lastname, middlename...) Это можно использовать в ограниченном контексте.

Теперь должен ли сервисный слой вернуть этот объект значения?... Personnaly, я бы этого не сделал. Я бы предпочел, чтобы это повторное использование было определено в моих репозиториях. Совместное использование сопоставлений в Nhibernate или совместное использование одного и того же класса проекции/сопоставления.

Надеюсь, что это поможет:)

Ответ 2

Из http://msdn.microsoft.com/en-us/library/jj554200.aspx:

Ограниченные контексты являются автономными компонентами с их собственными моделями доменов и их собственным вездесущим языком. Они не должны иметь зависимости друг от друга во время выполнения и должны быть способны работать изолированно. Однако они являются частью одной и той же общей системы и должны обмениваться данными друг с другом.

Если вы используете шаблон CQRS в ограниченном контексте, вы должны использовать события для этого типа связи: ваш ограниченный контекст может реагировать на события, которые возникают за пределами ограниченного контекста, и ваш ограниченный контекст может публиковать события, к которым могут присоединиться другие ограниченные контексты. События (односторонние, асинхронные сообщения, которые публикуют информацию о чем-то, что уже произошло), позволяют поддерживать свободную связь между вашими ограниченными контекстами.

Ответ 3

Если они строго разделены, я бы сделал их строго раздельными. Два разных класса в разных пространствах имен. Каждый из них имеет разные атрибуты.

Если HR создает HRM.Employee, может быть поднято событие, которое учитывает бухгалтерский учет и создает сотрудника Accounting.Employee.

Ответ 4

Если требуется несколько контекстов, определенно некоторые вещи могут быть смоделированы как сущность в некоторых контекстах и ​​объект значения в другом. Перевод с объекта на объект значения обычно прост, но от объекта значения до объекта может быть не так просто. Из Управление доменом, стр. 337

Механизм перевода не управляется моделью. Это не в ограниченный контекст. (Это часть самой границы, которая будет обсуждается в контекстной карте.)

Если контекст "Кадровые ресурсы" когда-либо понадобился задавать контексту учета вопрос о конкретном работнике, он стал бы запутанным вопросом.