3

我想在我的一个应用程序中使用域驱动设计,并且对用户身份验证有一些疑问。

我有一个名为User的聚合根,它具有像UserCredentialsPasswordActivationToken等值对象。我也很少有用于管理用户的域服务。例如UserRegistration服务如下所示:

public interface IUserRegistrationService
{
    IEnumerable<string> Register(NewUserRequest request);
}

它检查分配给用户注册过程的业务规则并将用户保留在数据库中。

现在我想对用户进行身份验证,所以我创建了UserAuthentication域服务:

public interface UserAuthenticationService
{
    IEnumerable<string> Authenticate(AuthRequest request);
}

它从存储库中获取用户,检查业务规则,更新和持久化用户数据更改,如 LastLoginDate。

但是我有一些疑问,如果身份验证过程属于域本身还是应该属于应用程序服务,至于我的域,用户的身份验证方式并不重要。但另一方面,在此服务中检查的身份验证规则属于我的域规则,因此它们是我域的组成部分。

那么,您在基于 DDD 的应用程序中将身份验证放在哪里?您对此问题的解决方案是什么?

4

2 回答 2

4

1.一般来说,认证和授权是应用程序中的子域。您最好在应用层/核心域中构建一个抽象来隔离它们。

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) {
         ......
    }
}

实现领域驱动设计中有很好的讨论和示例。作者单独对身份子域进行身份验证。

于 2014-02-14T06:52:44.700 回答
1

以下答案很大程度上取决于我对您的任务和环境的假设,所以不要盲目相信我。

我认为身份验证是一个业务流程。User它与,Registration等的概念高度耦合UserStatus

如果你问我如何用一个单词来调用这个业务流程,我会选择UserPolicy. 将UserPolicy其视为聚合根。它的边界包括以下实体:UserRegistrationServiceAuthenticationServiceUserRepository。所有这些都必须保持一致。这很容易实现,因为它们的每一个动作都经过它们的根实体:

IUserPolicy up = container.Resolve<IUserPolicy>();

up.RegisterUser(newUserRequest);

up.AuthUser(authRequest);
于 2014-02-14T07:37:08.260 回答