思考一种好的架构(八)
库存业务服务库:
[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) { } }
订单服务 依赖:
库存服务 依赖:
这一节没啥好说的