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