Идентификация обрабатывает аутентификацию и управляет пользователем и ролями
Итак, Идентификация обрабатывает аутентификацию и авторизация ;roles
- это просто детали реализации, которые должны быть скрыты от других ограниченных контекстов.Это означает, что Membership
BC не должно волновать, как работает авторизация, только то, что она работает.Итак, чтобы скрыть это, авторизационный BC должен опубликовать интерфейс, подобный следующему: canUserActivateMember(userId,memberId)
.
Теперь сложная часть состоит в том, что в обоих BC есть понятие members
, но это означает, чточто-то еще:
- в
Membership
BC, члены содержат (много) свойств и поведения, характерных для этого домена, таких как ID
, Name
, Status
, Gender
входя / выходя из клуба, независимо от того, что имеет отношение к этому домену - в
Authorization
BC, члены содержат только ID
, Chapter
и Status
, без поведения.Свойство Status
синхронизируется антикоррупционным слоем из Membership
BC (в кроне или чем-либо еще).
Итак, ваша служба ActivateMember
из Membership
BC должна выглядетьвот так:
public void ActivateMember(UserId userId, MemberId memberId)
{
//This handles invariants 1, 2 & 3
if(!authorization.canUserActivateMember(userId,memberId)) {
throw ExceptionOrSomething;
}
//here is the call into the domain
commands.Handle(new ActivateMember(memberId);
}
В Authorization
BC метод canUserActivateMember
может выглядеть так:
public boolean canUserActivateMember(UserId userId, MemberId memberId)
{
var user = userRepository.load(userId);
var member = memberRepository.load(memberId);
if(user.isSystemAdministrator()){
return true;
}
if(user.isChapterAdministrator() && member.hasChapter(user.getChapter)){
return true;
}
if(user.isChapterAdministrator() && member.isInactive()) {
return true;
}
return false;//the default
}
Итак, у вас есть два Member
класса, один вкаждый BC, но с разными свойствами и поведением.