zoukankan      html  css  js  c++  java
  • DDD实战5 实现上下文服务

    通过服务来协调领域对象,来添加产品用例。

    1.要实现产品上下文的服务,首先新建一个项目,在Product解决方案文件夹下面新建一个项目,项目的名称为:Product.AppSrv。

    2.这个项目首先引用Product.Domain项目,因为它操作领域对象,所以还要引用DDD.Repositories(为什么不取名Product.Repository呢,因为这个项目的初衷是放置所有的仓储实现,我们之前在里面定义了ProductRepositories文件夹)。

    因为它还要用到Util项目里面的东西,所也引用Util项目。

    3.当添加一个产品的spu的时候,不会传入形如 public ProductSPU CreateProductSPU(Guid id,string spuname,string spudesc,List<ProductSKU> productskus) 里面的 List<ProductSKU>参数

    因为应用服务是给webapi使用的,所以前段不会传入这样的对象,前端只会传入一些基本类型。

    所以在此我们要创建Dtos文件夹,在此文件夹中再创建两个文件夹 分别命名InputDtos和OutputDtos。

    在InputDtos文件夹下面新建AddProductSPUDto.cs

    public class AddProductSPUDto
        {
            public string SPUName { get; set; }
    
            public string SPUDesc{ get; set; }
            public List<string> SKUSpecs { get; set; }
            public List<string> SKUUnits { get; set; }
    
            public List<decimal> SKUDealerPrices { get; set; }
            public List<byte[]> SKUImages { get; set; }
    
            public List<decimal> PVs { get; set; }
    
        }

     4.添加用例,AddProductSPUUseCase.cs

    public class AddProductSPUUseCase:BaseAppSrv
        {
            private readonly IRepository irepository;
            private readonly IProductRepository iproductrepository;
    
            public AddProductSPUUseCase(IRepository irepository, IProductRepository iproductrepository)
            {
                this.irepository = irepository;
                this.iproductrepository = iproductrepository;
            }
    
            public ResultEntity<bool> AddProduct(AddProductSPUDto addProductSPUDto)
            {
                var productspuid = Guid.NewGuid();
                var productskus = new List<ProductSKU>();
                for (int i = 0; i < addProductSPUDto.SKUUnits.Count; i++)
                {
                    ProductSKU sKU = new ProductSKU().CreateProductSKU(addProductSPUDto.SPUName, productspuid, addProductSPUDto.SKUImages[i], addProductSPUDto.SKUDealerPrices[i]
                        , addProductSPUDto.PVs[i], addProductSPUDto.SKUUnits[i], addProductSPUDto.SKUSpecs[i]);
                    productskus.Add(sKU);
                }
                var productspu = new ProductSPU().CreateProductSPU(productspuid, addProductSPUDto.SPUName, addProductSPUDto.SPUDesc, productskus);
                
                try
                {
    //使用这个混蛋是因为它实现了Idisposeable接口
    using (irepository) { iproductrepository.CreateProduct(productspu);
    //在实际的使用中,我们这里的Commit 是通过DDD.DomainBase里面的EFCoreRepository.cs来实现的,后者实现了IRepository。
    //所以说,我们注入IRepository 和 IProductRepository 的context必须是同一个context irepository.Commit(); }
    return GetResultEntity(true); } catch (Exception ex) { throw ex; } } }
  • 相关阅读:
    前台线程与后台线程的区别
    触发器
    Asp.net AutopostBack 属性
    Spring实战拆书--SpringBean
    侣行APP
    用android去写一个小程序
    java如何使用JUnit进行单元测试
    JDK的安装与配置以及eclipse的使用
    软件工程第一次作业(1)
    软件工程第一次作业(2)
  • 原文地址:https://www.cnblogs.com/wholeworld/p/8862911.html
Copyright © 2011-2022 走看看