Давайте уявимо, що у мене є групи та користувачі, і коли користувач хоче приєднатись до групи, я викликаю метод groupsService.AddUserToGroup (group, user). У DDD я повинен робити group.JoinUser (користувач), який виглядає досить непогано.
Однак DDD також рекомендує використовувати сервіси (без громадянства) для виконання завдань, якщо завдання під рукою занадто складне або не вписується в модель сутності. Добре мати послуги в доменному шарі. Але послуги в доменному рівні повинні включати лише логіку бізнесу. Зовнішні завдання та логіка додатків (наприклад, надсилання електронного листа), з іншого боку, повинні використовувати службу домену на рівні додатків, у якій, наприклад, можна мати окрему службу (додаток).
Проблема з'являється, якщо у мене є деякі правила перевірки для додавання користувача ...
Правила перевірки дійсно належать доменної моделі! Вони повинні бути капсульовані всередині об'єктів домену (сутностей тощо).
... або деякі зовнішні завдання потрібно запустити, коли користувача додано до групи. Наявність цих завдань призведе до того, що суб'єкт господарювання має зовнішні залежності.
Хоча я не знаю, про яке зовнішнє завдання ви говорите, я припускаю, що це щось на зразок надсилання електронного листа тощо. Але це насправді не є частиною вашої моделі домену. Він повинен жити в шарі програми і там триматися. Ви можете мати службу на рівні свого додатка, яка працює з доменними службами та організаціями для виконання цих завдань.
Але той факт, що суб'єкт господарювання залежить від деяких зовнішніх служб / класів, не здається мені таким хорошим і "природним".
Це неприродно і не повинно відбуватися. Суб'єкт господарювання не повинен знати про речі, які не є його відповідальністю. Служби повинні використовуватися для упорядкування взаємодій суб'єктів.
Який правильний спосіб впоратися з цим у DDD?
У вашому випадку відносини, ймовірно, повинні бути двосторонніми. Чи приєднається до групи користувач, або група приймає користувача, залежить від вашого домену. Користувач приєднується до групи? Або користувач додається до групи? Як це працює у вашому домені?
У будь-якому випадку, у вас є двонаправлені відносини, і таким чином можна визначити кількість груп, до яких вже належить користувач у сукупності користувачів. Незалежно від того, передаєте ви користувачеві групу чи групу користувачеві, технічно тривіально, коли ви визначите відповідальний клас.
Потім перевірку має здійснювати суб'єкт господарювання. Вся справа викликається сервісом додаткового шару, який також може робити технічні речі, такі як надсилання електронних листів тощо.
Однак якщо логіка перевірки дійсно складна, послуга домену може бути кращим рішенням. У такому випадку інкапсулюйте правила бізнесу там, а потім викликайте його зі свого додаткового шару.