zoukankan      html  css  js  c++  java
  • 思考一种好的架构(八)

    库存业务服务库:

     [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)
            {
                
            }
        }

    订单服务 依赖:

     库存服务 依赖:

    这一节没啥好说的

  • 相关阅读:
    js 动态 activex 组件
    nodejs 任务调度使用
    javascript 停止事件冒泡以及阻止默认事件冒泡
    使用SQL字符串反转函数REVERSE巧妙实现lastindexof功能
    morris.js 简单学习
    weblogic启动受管服务器报错Authentication for user weblogic denied (weblogic 11g 域账号密码不生效的解决方法)
    正向代理与反向代理【总结】
    不休息的工作都是浪费时间
    Oracle实例名,服务名等概念区别与联系
    Tomcat启动找不到JRE_HOME的解决方法
  • 原文地址:https://www.cnblogs.com/AnAng/p/12611391.html
Copyright © 2011-2022 走看看