首页 > 解决方案 > 我应该将使用 DDD 和 CQRS 方式刷新访问令牌的代码放在哪里?

问题描述

我正在使用 ASP.NET Core 并学习 DDD 和 CQRS(包括 MediatR)。我已阅读eshopcontainers文档。在我的应用程序中,我们需要将每个用户的访问令牌和谷歌刷新令牌存储在我们的 SQL 数据库中,因为我们必须定期检查 gmail 中的一些状态。当我们实现该功能时,或多或少我们希望编写以下逻辑。

1. Get the access token and refresh token from our DB
2. If the access token is expired, we get the valid access token with refresh token
3. If the access token is updated in step 2, we save the new access token to DB
4. With the valid access token, we fetch information from gmail

此过程将用于 CQRS 模式中的几个命令处理程序。

我的问题是,

我目前的想法是创建一个UserService包含上述过程的方法。我的解决方案结构的具体示例如下。将UserService在几个命令处理程序中使用,并且不会在 QueryHandler 中使用,因为它偶尔会更新数据库。但是,如果有更好的基于 DDD 方式的想法,我想知道它。

解决方案结构

Application layer (depends on Domain and Infrastructure)
 - UserController.cs
 - CommandHandlers folder (several command handlers use UserService)
 - QueryHandlers folder 

Domain Layer (No dependency)
  - UserAggregate folder
    - User.cs (Model for user)
  - IRepository.cs (Interface)

Infrastructure Layer (depends on Domain)
  - EF Core related folder
  - Repository.cs (Implemented IRepository.cs)
  - UserService.cs (has the token update process)

用户.cs

public class User 
{   
    public string AccessToken { get; set; }
    public string RefreshToken { get; set; }
    public long Id {get; set;}
}

UserService.cs(只是一个想法)

public class UserService 
{
    ....

    GetValidAccessToken(long userId) 
    {
        var user = repository.Find(userId);
        if (user.AccessToken is expired) 
        {
            var newAccessToken = GetNewAccesstokenWithRefreshToken(user.RefreshToken);
            user.AccessToken = newAccessToken;
            repository.Save(user);
        }
        return user.AccessToken;
    }
}

标签: c#asp.net-coredomain-driven-designcqrsmediatr

解决方案


存储用户访问令牌和刷新令牌似乎不是业务/域问题。我认为你不应该试图通过 DDD 来处理它。如果您需要访问令牌CommandHandlers,我会将与访问令牌有关的逻辑放在域之外的某种中间件中。


推荐阅读