我想在我的某个应用程序中使用域驱动设计,并对用户身份验证有疑问。
我有一个名为用户的聚合根,其中包含 UserCredentials ,密码, ActivationToken 等值对象等。 我也没有很少的域服务来管理用户。 例如, UserRegistration 服务如下所示:
public interface IUserRegistrationService
{
IEnumerable<string> Register(NewUserRequest request);
}
它检查分配给用户注册过程的业务规则,并在数据库中保留用户。
现在我想对用户进行身份验证,因此我创建了 UserAuthentication 域名服务:
public interface UserAuthenticationService
{
IEnumerable<string> Authenticate(AuthRequest request);
}
它从存储库中获取用户,检查业务规则,更新并保留用户数据更改,如LastLoginDate。
但我有一些疑问,如果身份验证过程属于域本身,或者它应该属于应用程序服务,就我的域而言,用户的身份验证方式无关紧要。 但另一方面,在此服务中检查的身份验证规则属于我的域规则,因此它们是我域中不可或缺的一部分。
那么您在哪里将身份验证放在基于DDD的应用程序中?您对此问题的解决方案是什么?
答案 0 :(得分:2)
1.通常,身份验证和授权是应用程序中的su域。你最好在应用层/核心域中构建一个抽象来隔离它们。
public interface OrderingService// application layer
{
void PlaceOder(Order order) {
//delegate to identity subdomain to validate user request
UserAuthenticationService.Authenticate(ExtractFrom(order));
//delegate to booking core domain to handle core business
BookingService.placeOrder(order);
}
}
2.在Identity子域中,身份验证算法可以放在基础架构层中:
public class OathUserAuthenticationService:UserAuthenticationService //infrastructure layer
{
IEnumerable<string> Authenticate(AuthRequest request) {
......
}
}
Implementing Domain Driven Design中有很好的讨论和例子。作者将身份验证分配给身份子域。
答案 1 :(得分:1)
以下答案在很大程度上取决于我对你的任务和环境的假设,所以不要盲目相信。
我认为身份验证是一个业务流程。它与User
,Registration
,UserStatus
等
如果您问我如何使用单个单词来调用此业务流程,我会选择UserPolicy
。将UserPolicy
视为聚合根。它的边界包括以下实体:User
,RegistrationService
,AuthenticationService
,UserRepository
。所有这些都必须保持一致。它很容易实现,因为与它们的每个动作都是通过它们的根实体:
IUserPolicy up = container.Resolve<IUserPolicy>();
up.RegisterUser(newUserRequest);
up.AuthUser(authRequest);