使用强类型实体Id来避免原始类型困扰(一)

本文探讨了在编程中如何通过使用强类型实体ID来避免原始类型的困扰,如参数错误导致的问题。作者通过一个电子商务网站订单管理的例子,展示了原始类型(如GUID)在表示领域概念时可能导致的错误,并提出创建自定义类型如`OrderID`和`UserID`来封装这些概念,从而利用C#的类型系统捕获潜在错误。文章还提到了强类型ID的实现和测试,强调了在领域业务中使用强类型ID的价值。
摘要由CSDN通过智能技术生成

原文地址:https://andrewlock.net/using-strongly-typed-entity-ids-to-avoid-primitive-obsession-part-1/
作者:Andrew Lock
译者:Lamond Lu
译文地址:https://www.cnblogs.com/lwqlun/p/10693763.html

回想一下,在你以往编程的过程中,是否经常遇到以下场景:当你从一个服务(Web Api/Database/通用服务)中请求一个实体时,服务响应404, 但是你确信这个实体是存在的。这种问题我已经见过很多次了,有时候它的原因是请求实体时使用了错误的ID。 在本篇博文中,我将描述一种避免此类错误( 原始类型困扰)的方法,并使用C#的类型系统来帮助我们捕获错误。

其实,许多比我厉害的程序员已经讨论过C#中原始类型困扰的问题了。特别是Jimmy Bogard, Mark Seemann, Steve SmithVladimir Khorikov编写的一些文章, 以及Martin Fowler的代码重构书籍。最近我正在研究F#, 据我所知,这被认为是一个已解决的问题!

原始类型困扰的一个例子

为了给出一个问题说明,我将使用一个非常基本的例子。假设你有一个电子商务的网站,在这个网站中用户可以下订单。

其中订单拥有以下的简单属性。

public class Order
{
   
    public Guid Id {
    get; set; }
    public Guid UserId {
    get; set; }
    public decimal Total {
    get; set; }
}

你可以通过OrderService来创建和读取订单。

public class OrderService
{
   
    private readonly List<Order> _orders = new List<Order>();

    public void AddOrder(Order order)
    {
   
        _orders.Add(order);
    }

    public Order GetOrderForUser(Guid orderId, Guid userId)
    {
   
        return _orders.FirstOrDefault(
            order => order.Id == orderId && order.UserId == userId);
    }
}

为了简化代码,这里我们将订单对象保存在内存中,并且只提供了两个方法。

  • AddOrder(): 在订单集合中添加订单
  • GetOrderForUser(): 根据订单Id和用户Id获取订单信息

最后,我们创建一个API控制器,调用这个控制器我们可以创建新订单或者获取一个订单信息。

[Route("api/[controller]")]
[ApiController, Authorize]
public class OrderController : ControllerBase
{
   
    private readonly OrderService _service;
    public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值