shu*_*ch5 5 c# domain-driven-design cqrs mediatr asp.net-core
我正在使用 ASP.NET Core 并学习 DDD 和 CQRS(包括 MediatR)。我已阅读eshopcontainers文档。在我的应用程序中,我们需要在 SQL DB 中存储每个用户的 google 访问令牌和刷新令牌,因为我们必须定期检查 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
Run Code Online (Sandbox Code Playgroud)
此过程将在 CQRS 模式中的多个命令处理程序中使用。
我的问题是,
DDD、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)
Run Code Online (Sandbox Code Playgroud)
用户.cs
public class User
{
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public long Id {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我同意@Ankit Vijay 的观点。请接受他的正确答案,因为我只会对此进行扩展。
您通常在需要授权访问的集成层中使用访问令牌。例如,Web API 和其他视图控制器。使用消息队列时,消息处理程序不应公开,因此通常不需要授权。
据我所知,在您的情况下,您需要使用访问令牌访问外部存储来获取用户特定的数据。这意味着访问令牌可能会在尝试该操作之前过期。
在我看来,你有 3 个选择:
1) 您在初始集成点(例如 Web API 控制器)获取相关信息,然后传递该数据。
2) 您传递用户名并使用某种服务帐户来获取用户的访问令牌,其中服务帐户有权代表用户执行此操作,然后使用访问令牌来获取相关数据。
3) 服务帐户可能有能力为用户收集这些额外信息,在这种情况下,服务帐户将进行身份验证以获取令牌,然后请求相关用户的数据。
在我之前参与的一个项目中,我们必须使用webMethods集成服务器,其中后端团队使用 ADFS 令牌。该令牌的有效期为 8 小时,由于各种原因,某些操作最终仅在该时间之后执行。由于服务帐户在 ADFS 上拥有某种形式的委派权限,因此将为用户刷新过期的令牌。我没有参与该实施,但这大致是规避该问题的想法。
如果您无法让服务帐户刷新令牌或直接获取所需的数据,我想选项(1)将是您最好的选择。
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |