- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ASP.NET Core 并学习 DDD 和 CQRS(包括 MediatR)。我读过eshopcontainers文件。在我的应用程序中,我们需要在我们的 SQL 数据库中存储每个用户的谷歌访问 token 和刷新 token ,因为我们必须定期检查 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 方式的逻辑放在哪里?它应该放在存储库、应用程序服务还是域服务...?
我们可以从查询处理程序中调用该方法吗?我想知道这是因为那个逻辑偶尔会更新数据库中的数据,所以我认为我们不应该从查询处理程序中调用这个过程
我目前的想法是创建一个包含上述过程的 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)
User.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;
}
}
最佳答案
我同意@Ankit Vijay 的观点。请接受他的回答是正确的,因为我只会对此进行扩展。
您通常在需要授权访问的集成层中使用访问 token 。例如,Web API 和其他 View Controller 。消息处理程序在使用消息队列时不应公开,因此它们通常不需要授权。
据我所知,在您的案例中,您需要使用访问 token 访问外部存储以获取用户特定的数据。这意味着访问 token 可能会在尝试该操作之前过期。
在我看来,您有 3 个选择:
1) 您在初始集成点获取相关信息,例如 Web API Controller ,然后传递该数据。
2) 您传递用户名并使用某种服务帐户为用户获取访问 token ,服务帐户有权代表用户这样做,然后使用获取相关数据的访问 token 。
3) 服务帐户可能有能力为用户收集这些额外信息,在这种情况下,服务帐户将进行身份验证以获取 token ,然后为相关用户请求数据。
在我之前的一个项目中,我们必须使用 webMethods 集成服务器,后端团队在其中使用 ADFS token 。该 token 有 8 小时的有效期,并且出于各种原因,某些操作仅在该时间之后才执行。由于服务帐户在 ADFS 上具有某种形式的委派权限,因此将为用户刷新过期 token 。我没有参与该实现,但这基本上是规避问题的想法。
如果您无法让服务帐户刷新 token 或直接获取所需数据,我想选项 (1) 是您最好的选择。
关于c# - 我应该将使用 DDD 和 CQRS 方式刷新访问 token 的代码放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59905735/
这里有一个很大的设计缺陷,但我无法解决它: 业务需要有点涉及,所以我会尽量保持简单。 我们有一张购物表和一张退货表。当进行退货时,我们必须找到与数据库中最早购买的退货匹配,并将其记录在“已应用退货”表
在我的家庭项目中,我遇到了确定域对象类型的问题。 领域:公交时刻表 限界上下文:路由(公共(public)交通基础设施,ctx1)、时间表(调度,ctx2) 对象: Station - 描述一个公交车
我有一个名为“产品类型”的值类型,它被分配给了一个产品。 (一个产品有一个产品类型) 为了允许用户从列表中选择类型,我将填充一个下拉列表。在哪里检索产品类型列表最合适?一个实现存储库模式的类? 编辑:
域这个词在 DDD 中究竟是什么意思?我一直在阅读定义……虽然我看到了域模型之类的东西并理解模型是什么 - 域模型是什么意思? 域实际上是什么意思? 谢谢 最佳答案 域是指您的应用程序解决的主题。 例
DDD 中的域模型应该与持久性无关。 CQRS 要求我为我不想在读取模型中包含的所有内容触发事件。 (顺便说一下,将我的模型拆分为一个写模型和至少一个读模型)。 ES 要求我为所有改变状态的事件触发事
Eric 在他的书中触及了 的主题。模块 很少。他也没有通过示例讨论模块结构与有界上下文的关系。限界上下文是否包含模块或模块包含限界上下文?当应用程序具有 DDD 时,它的可扩展性有多容易? 在我们设
前言 笔者于2021年入职了杭州一家做水务系统的公司,按照部门经理要求,新人需要做一次个人分享(主题随意)。 当时笔者对DDD充满了浓厚的兴趣,之前也牛刀小试过,于是就决定班门弄斧Show一下
上部分 模型驱动设计的构造块 为维护模型和实现之间的关系打下了基础。在开发过程中使用一系列成熟的基本构造块并运用一致的语言,能够使开发工作更加清晰而有条理。 我们面临的真正挑战是找到
3. 领域对象的生命周期 。 每个对象都有生命周期,如下图所示。对象自创建后,可能会经历各种不同的状态,直至最终消亡——要么存档,要么删除。当然很多对象是简单的临时对象,仅通过调用构造函数来创建
为了保证软件实践得简洁并且与模型保持一致,不管实际情况如何复杂,必须运用建模和设计的实践. 某些设计决策能够使模型和程序紧密结合在一起,互相促进对方的效用。这种结合要求我们注意每个元素的细节
大家好,我是 ddd 设计的新手,正在尝试使用这种在 C# 中工作的模式开发我的第一个应用程序 在我的应用程序中,我有一个包含子实体 Assets 的聚合合约,当添加或结算 Assets 时,我应该在
我正在尝试弄清楚如何使项目的一些消费者(业务客户)的不变量保持一致,他们对同一版本的聚合根有自己的要求。让我们以客户为例,提出假设性问题以满足以下愚蠢的逻辑: public class Custome
我见过一些具有实体值对象表示的 DDD 项目。它们通常显示为 EmployeeDetail、EmployeeDescriptor、EmployeeRecord 等。有时它包含实体 ID,有时不包含。
我试图了解如何表示某些 DDD(域驱动设计)规则。 遵循蓝皮书约定,我们有: 根实体具有全局身份并负责检查不变量。 根实体控制访问,并且不会被其内部结构的更改所蒙蔽。 对内部成员的 transient
我对 ddd 中的验证方法有疑问。我已经阅读了相当有争议的意见。有人说这应该在实体之外,其他人说这应该放在实体中。我试图找到一种我可以遵循的方法。 例如,假设我有带有电子邮件和密码的 User 实体。
寻找有关如何解决此问题的建议,并了解域驱动设计是否真的是这里的最佳模式。 我的客户正在重新构建其几近过时的工具和服务堆栈。客户是一个快速扩张的电子商户。它的核心产品是它的大型电子商务网站。围绕该网站,
我很难找出实现依赖于数据库中存储的数据的业务规则验证的最佳方法。在下面的简化示例中,我想确保用户名属性是唯一的。 public class User() { public int Id { g
情况: 要处理域事件,Jimmy Bogart proposed 一种将事件存储在聚合中的方法。 在我看来,这是一种非常方便的方法。但是,域服务中的域事件怎么办? 域服务不应该有状态(stateles
我正在处理遗留项目,试图改进项目结构。我的问题是我应该如何组织代码结构。我看到两个选项: #1 business-domain / layer app/ ----accout/ --------app
根据 DDD 原则,所有处理与特定聚合根对象相关的实体的 CRUD 操作都应该由聚合根进行。 但是我们如何从 aggr 根中仅更改实体的单个属性?我们应该在实体中有 setter 方法吗?这些方法应该
我是一名优秀的程序员,十分优秀!