Майже за будь-яких обставин первинні ключі не є частиною домену вашого бізнесу. Звичайно, у вас можуть бути важливі об’єкти, що звертаються UserName
до користувачів, з унікальними індексами ( для користувачів або OrderNumber
замовлень), але в більшості випадків немає жодної необхідності в явній ідентифікації об'єктів домену за одним значенням або набором значень комусь, але можливо адміністративний користувач. Навіть у тих виняткових випадках, особливо якщо ви використовуєте глобальні унікальні ідентифікатори (GUID) , вам сподобається або хочете використовувати альтернативний ключ, а не викривати сам первинний ключ.
Отже, якщо моє розуміння дизайну, керованого доменом, є точним, первинні ключі не потребують і, таким чином, не повинні піддаватися впливу, і добре позбавлятися. Вони некрасиві і стискають мій стиль. Але якщо ми вирішимо не включати первинні ключі в доменну модель, є наслідки:
- Наївно, об'єкти передачі даних (DTO), які походять виключно з комбінацій доменних моделей, не матимуть первинних ключів
- Вхідний DTO не буде мати первинний ключ
Отже, чи можна впевнено сказати, що якщо ви дійсно збираєтеся залишатися чистими та викорінювати первинні ключі у вашій моделі домену, ви повинні бути готові мати можливість обробляти кожен запит з точки зору унікальних показників цього первинного ключа?
По-іншому, яке з наведених рішень є правильним підходом до роботи з ідентифікацією конкретних об'єктів після видалення ПК в доменних моделях?
- Вміти ідентифікувати об'єкти, з якими потрібно мати справу за іншими атрибутами
- Повернення первинного ключа назад у DTO; тобто виключаючи ПК при зіставленні від стійкості до домену, потім рекомбінації ПК при зіставленні з домену в DTO?
EDIT: Давайте зробимо це конкретне.
Скажімо , моя модель домену , VoIPProvider
який включає в себе такі області , як Name
, Description
, URL
, а також посилання подобається ProviderType
, PhysicalAddress
і Transactions
.
Тепер скажімо, що я хочу створити веб-сервіс, який дозволить пільговим користувачам керувати VoIPProvider
s.
Можливо, зручний для користувача ідентифікатор в цьому випадку марний; врешті-решт, провайдерами VoIP є компанії, чиї назви мають тенденцію бути чіткими в комп'ютерному розумінні і навіть досить чіткими в людському розумінні з бізнес-причин. Тому може бути достатньо сказати, що унікальність VoIPProvider
повністю визначається (Name, URL)
. Отже, скажімо, мені потрібен метод, PUT api/providers/voip
щоб привілейовані користувачі могли оновити VoIP
провайдерів. Вони надсилають a VoIPProviderDTO
, що включає в себе багато, але не всі поля з поля VoIPProvider
, включаючи деякі згладжування потенційно. Однак я не можу прочитати їхні думки, і їм все одно потрібно сказати, про якого постачальника ми говоримо.
Здається, у мене є 2 (можливо 3) варіанти:
- Включіть первинний ключ або альтернативний ключ до моєї моделі домену та надішліть його до DTO, і навпаки
- Визначте постачальника, про який ми піклуємось, наприклад, за допомогою унікального індексу
(Name, Url)
- Введіть якийсь проміжний об'єкт, який завжди може відображати між шаром стійкості, доменом і DTO таким чином, щоб не виставляти деталей реалізації щодо шару стійкості - скажімо, вводячи тимчасовий ідентифікатор пам'яті в пам'яті при переході від домену до DTO і назад,