思考一种好的架构(八)
库存业务服务库:
[Table("Stock")] public class StockEntity { [ColumnAttribute(IsPrimaryKey = true)] [AutoIncrement] public int ID { get; set; } /// <summary> /// 商品ID /// </summary> public int ProductID { get; set; } /// <summary> /// 数量 /// </summary> public int Number { get; set; } }
public class StockServer : IStock { IDbContext DC; public StockServer(IDbContext DC) { this.DC = DC; } public IQuery<StockDTO> GetSingle(int productID) { return DC.Query<StockEntity>().Where(x => x.ProductID.Equals(productID)).Select(x=>new StockDTO() { ID=x.ID, Number=x.Number, ProductID=x.ProductID }); } public bool ReducedInventory(int productID, int number) { var result = DC.Update<StockEntity>(x => x.ProductID.Equals(productID) && x.Number > 0, d => new StockEntity() { Number = d.Number - number }); if (result > 0) { return true; } else { return false; } } public IQuery<StockDTO> StockNumberQuery(int? minNumber, int? maxNumber) { var result = DC.Query<StockEntity>() .EmptyCheck(minNumber, x => x.Number >= minNumber) .EmptyCheck(maxNumber, x => x.Number <= maxNumber); return result.Select(x => new StockDTO() { ID = x.ID, Number = x.Number, ProductID = x.ProductID }); } }
public static void ConfigureServices(IServiceCollection services) { services.AddTransient<IStock, StockServer>(); } public static void Configure(IApplicationBuilder app, IHostingEnvironment env) { }
上节有提到库存服务,这节不再赘述
订单服务:
[APIRouth("Order")] [ApiController] public class OrderController : Controller { IOrder orderServer; public OrderController(IOrder orderServer) { this.orderServer = orderServer; } [HttpGet] [Command] public IActionResult GenerateOrder(int productID, int number) { var result = orderServer.GenerateOrder(productID, number); return Json(result); } }
[ColumnAttribute(IsPrimaryKey =true)] [AutoIncrement] public int ID { get; set; } /// <summary> /// 商品ID /// </summary> public int ProductID { get; set; } /// <summary> /// 数量 /// </summary> public int Number { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateTimer { get; set; }
public class OrderServer : IOrder { IDbContext DC; IProduct product; IStock stock; IMediator mediator; public OrderServer(IDbContext DC, IProduct product, IStock stock, IMediator mediator) { this.mediator = mediator; this.product = product; this.DC = DC; this.stock = stock; } public bool GenerateOrder(int productID, int number) { var productDto = product.GetSingle(productID); if (productDto == null) { throw new Exception("商品未找到"); } if (!stock.ReducedInventory(productID, number)) { throw new Exception("库存不足"); } if (new Random().Next(100) > 50) { throw new Exception("测试回滚库存"); } mediator.Publish(new OrderGenerationEvent(DateTime.Now, number) { }); return true; }
Command特性头表示这次请求时写操作请求
这里有提到mediator,事件总线(EventBus)
之前的CQRS也有提及,事件总线具体后续再说
public static class Startup { public static void ConfigureServices(IServiceCollection services) { services.AddTransient<IOrder, OrderServer>(); } public static void Configure(IApplicationBuilder app, IHostingEnvironment env) { } }
订单服务 依赖:
库存服务 依赖:
这一节没啥好说的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!