c# - 我应该将使用 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 模式中的几个命令处理程序。
我的问题是,
我应该将 DDD、CQRS 方式的逻辑放在哪里?它应该放在存储库、应用程序服务还是域服务中......?
我们可以从查询处理程序中调用方法吗?我想知道这是因为该逻辑偶尔会更新 DB 中的数据,所以我认为我们不应该从 Query Handler 调用此过程
我目前的想法是创建一个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;
}
}
解决方案
存储用户访问令牌和刷新令牌似乎不是业务/域问题。我认为你不应该试图通过 DDD 来处理它。如果您需要访问令牌CommandHandlers
,我会将与访问令牌有关的逻辑放在域之外的某种中间件中。
推荐阅读
- python-3.x - 执行 pytorch 代码 AttributeError 时出错:“函数”对象没有属性“变量”
- c# - Hangfire、.Net Core 和 Entity Framework:并发异常
- java - 遍历 DataProvider 的 JDBC ResultSet?
- scala - 在 if 保护之前转换 Scala 案例变量
- mysql - 通过结果MySQL的索引获取行的值
- python - 使用 Jinja2 的多个配置文件的 YAML 序列化数据
- css - bulma 的 `pagination-previous` 的源代码在哪里?
- c# - 使用证书解密加密密钥在 .NET 中不起作用但在 Openssql 中起作用
- r - R ggpubr:按组添加平均水平线和配对比较?
- doxygen - Doxygen 功能自动链接问题