在哪里检查用户电子邮件尚不存在?

2024-04-24

我有一个帐户对象,可以像这样创建用户;

public class Account
{
    public ICollection<User> Users { get; set; }

    public User CreateUser(string email)
    {
        User user = new User(email);
        user.Account = this;
        Users.Add(user);
    }
}

在我的服务层中,当创建新用户时,我调用此方法。但是有一条规则,即用户的电子邮件对于该帐户必须是唯一的,那么它会去哪里呢?对我来说,它应该进入 CreateUser 方法并添加一行,仅检查电子邮件对于该帐户是否是唯一的。

然而,如果要这样做,那么该帐户的所有用户都需要加载,这对我来说似乎有点开销。最好在数据库中查询用户的电子邮件 - 但在方法中执行此操作将需要帐户对象中的存储库,不是吗?也许答案是从存储库加载帐户而不是执行;

var accountRepository.Get(12);
//instead do
var accountRepository.GetWithUserLoadedOnEmail(12, "[email protected] /cdn-cgi/l/email-protection");

然后,帐户对象仍然可以检查用户集合中的电子邮件,如果找到,它就会立即加载。

这有效吗?你会怎么办?

我使用 NHibernate 作为 ORM。


首先,我认为您不应该使用异常来处理“正常”业务逻辑,例如检查重复的电子邮件地址。这是一个有据可查的反模式,最好避免。保持对数据库的约束并处理任何重复的异常,因为它们无法避免,但尝试通过检查将它们保持在最低限度。我不建议锁定桌子。

其次,你在这个问题上贴上了DDD标签,所以我就用DDD的方式来回答。在我看来,您需要域服务或工厂。一旦您将此代码移动到域服务或工厂中,您就可以将 UserRepository 注入其中并调用它以查看是否已存在具有该电子邮件地址的用户。

像这样的事情:

public class CreateUserService
{
private readonly IUserRepository userRepository;

public CreateUserService(IUserRepository userRepository)
{
    this.userRepository = userRepository;
}

public bool CreateUser(Account account, string emailAddress)
{
    // Check if there is already a user with this email address
    User userWithSameEmailAddress = userRepository.GetUserByEmailAddress(emailAddress);
    if (userWithSameEmailAddress != null)
    {
        return false;
    }

    // Create the new user, depending on you aggregates this could be a factory method on Account
    User newUser = new User(emailAddress);
    account.AddUser(newUser);
    return true;
}
}

这允许您稍微分离职责并使用域服务来协调事物。希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里检查用户电子邮件尚不存在? 的相关文章

  • 聚合根引用其他聚合根

    我目前正在大量使用 DDD 并且在从其他聚合根加载 操作聚合根时遇到问题 对于模型中的每个聚合根 我还有一个存储库 存储库负责处理根的持久性操作 假设我有两个聚合根 以及一些成员 实体和值对象 聚合根 1 和聚合根 2 AggregateR
  • 不变量和验证规则有什么区别?

    我经常看到这个词不变量在DDD中 Here https msdn microsoft com en us magazine hh205755 aspx迪诺 埃斯波西托谈到了这一点 如果我查看 NET 库 我会看到验证属性 https msd
  • 使用持久函数,如何从活动函数返回多个值

    我是领域驱动设计的忠实粉丝和开发人员 并且总是尝试将技术 架构映射到 DDD 的世界中 将微服务映射到有界上下文提供了自然的结合 归根结底 我只想专注于我的业务逻辑并将其托管在正确的环境中 Durable Functions 对我来说看起来
  • 当“给定 id 的用户不存在”时,我应该抛出 IllegalArgmentException 吗?

    假设我们有一个方法changeUserName Long id String newName 它调用存储库的findUser Long id 找到正确的用户实体 然后更改其名称 扔一个合适吗IllegalArgmentException w
  • 使用DDD,如何实现批处理?

    我的逻辑包括从一个系统中选择大量记录 执行多个转换 基于业务规则 并将它们插入到另一个系统中 将这些记录中的每一个实例化为对象 对它们执行转换 然后将所有这些对象插入到另一个系统中 这似乎对性能 和内存 产生了很大的影响 在 DDD 中实现
  • 使用 CQRS 和事件溯源时的唯一性验证

    我正在尝试使用事件源来实现我自己的 CQRS 基础设施 以更好地学习它 作为一个示例项目 我正在实现一个博客引擎 我知道它可能不是一个完美的选择 但我只想做一些真实的事情 我现在遇到的问题是验证 每个帖子都有一个shortUrl 以及sho
  • DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系

    我有以下 DDD 场景 分为以下聚合 User 各位朋友 用户协会 文件 供用户上传 画廊 文件分组 消息 用户通信 群组 用户可以创建并且其他成员可以加入 GroupMessages 发送给组中所有成员的消息 群组论坛 群组成员可以讨论各
  • Asp.Net MVC + CSLA + DDD 可能吗

    前几天 我被要求审查一个基于 ASP NET MVC CSLA DDD 域驱动设计 的系统 该系统的第一个版本是基于ASP NET MVC CSLA 第二个版本是在此基础上添加了 DDD 原因是 嗯 我不知道是什么 当我查看两种不同架构的图
  • DDD - 使用 Doctrine 2 的有界上下文之间的关联映射

    我正在努力理解使用 Doctrine 2 实现来自不同有界上下文的两个实体之间的关联映射的正确方法 假设有两个 User 和 Post 实体分别属于 User 和 Content 有界上下文 内容 上下文中还有一个 用户 概念 它通过多对一
  • 模型与服务解耦:如果我的模型需要服务怎么办?

    服务层应该位于模型层之上 因此 模型不应该调用服务 然而 我面临着我需要的情况 例如 interface Component getResult class Number implements Component private value
  • 应如何聚合公开子实体的信息?

    从这个问题跟进实体是否应该有方法 如果有 如何防止它们在聚合之外被调用 https stackoverflow com questions 51907447 should entity have methods and if so how
  • 领域驱动设计模式 - 从领域访问存储库

    我一直致力于将领域驱动设计模式应用到我们的 Web 应用程序中 我们遇到的问题之一是避免使用实体内的存储库 例如 我们有一些实体 其方法将触发电子邮件 因此 我们必须有权访问电子邮件模板 存储在数据库中 并在数据库队列表中创建新的电子邮件记
  • CQRS、DDD同步报告数据库

    我们正在尝试 CQRS 和 DDD 以及事件溯源 假设我有一位客户更新了电子邮件地址 这会触发 CustomerUpdatesEmailAddress 事件 这会进入我的操作 写入数据库 并更新表 我们的系统设计为有一个运行的 ETL 流程
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了
  • 有界上下文共享相同的聚合

    DDD 公开了有界上下文 领域模型 聚合 但我经常错过业务规则的关键点 我想知道业务规则如何集成到这种方法中 这是一个例子 假设您在一家信贷公司中有 2 个有界上下文 一项用于追偿债务 另一项用于提前退款 这些背景嵌入了真正的业务特性 从概
  • 首先是 DDD 数据库。如何处理聚合

    我正在尝试学习 DDD 的概念 我做了一个项目 我使用数据库优先方法 在基础设施中 我添加了一个 edmx 文件 我选择自动生成实体 现在在 域 中我正在尝试创建聚合 但在这里我遇到了一些问题 我正在尝试创建一个名为 User 的聚合 但
  • 使用 JPA 实体作为域模型是一个好习惯吗?

    或者创建一个由域模型组成的域层并与 JPA 实体对话以进行数据库访问 两种方法的优缺点是什么 谢谢 这确实取决于您对域进行编码的方式 一般来说 在 Java 中 我更喜欢创建一组单独的 JPA 注释的 DTO 来处理持久性 此类 DTO 将
  • 在 DDD 中,表示层可以同时使用 Repository 和 Service 类吗?

    如果表示层只应该使用服务 那么服务类必须公开存储库已实现的相同方法 以使它们可供表示层使用 这似乎是错误的 有人可以帮我澄清一下吗 我敢打赌 这似乎是错误的 因为您实际上并不需要这种抽象级别 应用服务有facades http en wik
  • 使用组合来表示“is – a”关系时出现的问题

    我正在为人力资源系统开发系统 有会计员工和程序员员工 加入公司的第一个月 员工没有被赋予任何角色 一名员工可以同时担任会计师和程序员 我有一个由以下代码所示的设计 现在 我需要通过实现新功能来增强系统 解雇所有会计师 终止意味着将员工的状态
  • 除了“真实”对象之外,DDD 存储库还可以使用摘要对象吗?

    假设我正在创建一个存储库来存储数字电子书 如下面的界面所示 该存储库将存储书籍的实际文本以及标识书籍的元数据 标题 作者 出版商 ISBN 等 public interface IBookRepository void AddBook Bo

随机推荐

  • C++:用 istream 包装 vector

    我想包一个vector
  • Eclipse 中的默认导入

    有没有办法自定义 Eclipse 中的默认导入 例如 如果我默认打开一个新的 JUnit 测试类 我会得到以下导入 import static org junit Assert import org junit Test 我想得到什么 im
  • 无法创建“匿名类型”类型的常量值。此上下文中仅支持基本类型或枚举类型

    我对linq和实体框架 我正在尝试解决以下问题为何不起作用的问题 产生的错误是 无法创建 匿名类型 类型的常量值 在此上下文中仅支持原始类型或枚举类型 我已经尝试了很多不同的方法 但仍然收到与原始类型相关的错误 如果有人能看一下下面的代码并
  • 如何让 Maven 发出有关传递依赖版本不匹配的警告?

    在下面的 Maven 依赖项示例中 slf4j 依赖项想要引入 log4j 1 2 17 log4j 显式依赖项想要引入 1 2 15 Maven 将 log4j 解析为版本 1 2 15 但是 Maven 没有打印出 sl4j 需要更高版
  • 通过动画将视图的可见性从消失变为可见

    我有一个观点是invisible默认情况下 只是第一次 现在我需要将可见性切换为VISIBLE有了这个animation if myView getVisibility View INVISIBLE myView setVisibility
  • Http 请求的加载指示器

    我的问题的根源是在 http 请求上显示加载指示器 我想在服务级别上执行此操作 而不必为每个组件编写代码 我所做的是实现一个 http 包装器 它基本上执行以下操作 getMyHttpObservable setLoadingIndicat
  • 具有 Azure Key Vault 的本地 ASP.NET Framework Web 应用程序

    我们正在尝试保护内部 ASP NET Framework Web 应用程序中的应用程序机密 向我提供的最初计划是使用 Azure Key Vault 我开始使用我的 Visual Studio Enterprise 订阅进行开发工作 并且在
  • Laravel,获取当前登录的用户

    我想在应用程序中显示当前登录用户的列表 我想使用 Laravel Auth 方法 我正在查看 API 但找不到类似的东西 我可能需要循环访问会话存储 然后将其与用户 ID 匹配 我对吗 更新 忘了提及 我将会话存储在数据库中 当前登录 是普
  • 为字符串数组分配内存

    我想使用两个函数填充一个字符串数组 第一个 如果我有n个字符串要分配 将分配n个内存空间 第二个将为每个读取的字符串分配内存 这是第一个函数 char allocate int n char t t char malloc n sizeof
  • 数据透视表:检测数据透视字段何时折叠

    对于数据透视表中显示的数据 我选择对数据表的某些部分应用条件格式以突出显示某些范围内的值 弄清楚如何以不同于小计数据的方式突出显示第二级行数据很有趣 但我能够解决它 我的 VBA 使用以下命令触发Worksheet PivotTableUp
  • Google / OAuth 2 - 自动登录

    我正在尝试结合一些 Google API 来使用 OAuth 2 0 虽然授权过程非常简单 但在初始授权完成后 我遇到了自动授权的问题 So 1 Authorization is done for the first time user g
  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • iOS/WKWebView 上 SVG 的随机故障渲染

    在我们的 iOS 应用程序中显示 SVG 图标时 我们遇到了奇怪的间歇性 非常偶然 渲染故障 基于WKWebView 当它确实发生时 它似乎可能与 CSS 相关 因为如果我在调试页面时在 Safari 中更改一些随机 甚至完全不相关 的 C
  • 电脑重启后Eclipse无法启动

    我的 Eclipse 没有启动 因为我的计算机有点冻结 所以我不得不强制重新启动它 当我不得不重新启动时 Eclipse 已打开 我相信这很可能是原因 我不知道如何解决这个问题 每当我尝试打开它时 它都会告诉我检查工作区中的 log 文件
  • PHP 根据值列计算文本文件的行数

    继续我之前的question https stackoverflow com questions 52397274 php count text file rows based on date and time 我有名为拒绝的文本日志文件
  • 在 pgAdmin 中创建 ER 图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请提供有关如何使用附带的管理工具构建基本实体关系图 ERD 的分步答案 postgres pgAdmi
  • Seaborn 热图引发意外错误

    我正在尝试执行以下代码 import seaborn as sns import pandas as pd import numpy as np year range 1949 1961 month January February Mar
  • 将小数转换为尽可能小的数字类型,而不会丢失任何数据

    我想写一个方法来转换decimal尽可能最小的数字类型 而不会丢失任何数据 举些例子 Convert 1 应该返回一个byte Convert 257 应该返回一个short Convert 1 1 应该返回一个float 等等 该方法的输
  • SQL:计数和子查询

    再次使用 count 和 sql 在 sqlite 上 我有表格 论文 paper id doi 年份 作者 paper id author id inst id 作者 作者 ID 姓名 名字 安装 inst id 名称 see id in
  • 在哪里检查用户电子邮件尚不存在?

    我有一个帐户对象 可以像这样创建用户 public class Account public ICollection