领域驱动设计DDD实战进阶第一波(七):开发通常业务的大健康行业直销系统(实现产品上下文接口与测试)

前一篇文章咱们介绍了如何将建立产品的领域逻辑与产品的持久化仓储经过上架产品的用例组织起来,完成了一个功能。在实际的项目中,多种前端的形态好比PCWeb、微信小程序、原生APP等要调用后端的功能,一般要将后端的功能包装成RESTFUL风格,这样前端就可使用Http Get或Post方式调用后端的功能,因此这篇文章咱们先来完成后端的Asp.net Core WebApi,经过WebApi将上架产品的功能暴露出去。前端

实现上下产品接口:

[Produces("application/json")]
[Route("api/Product")]
public class ProductController : Controller
{
    ServiceLocator servicelocator = new ServiceLocator();
    [HttpPost]
    [Route("AddProduct")]
    public ResultEntity<bool> AddProduct([FromBody] AddProductSPUDTO addproductspudto)
    {
        var result = new ResultEntity<bool>();
        var productdbcontext = servicelocator.GetService<IProductContext>();
        var irepository = servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", productdbcontext } });
        var iproductrepository=servicelocator.GetService<IProductRepository>(new ParameterOverrides { { "context", productdbcontext } });
        var addproductspuusecase = new AddProductSPUUseCase(irepository,iproductrepository);
        try
        {
            result = addproductspuusecase.AddProduct(addproductspudto);
            result.IsSuccess = true;
            result.Count = 1;
            result.Msg = "上架产品成功!";
        }
        catch(Exception error)
        {
            result.ErrorCode = 100;
            result.Msg = error.Message;
        }
        return result;
    }
}
复制代码

1.首先你们看到接口层是很是薄的一层,它并不包含业务逻辑和数据访问,它只是初始化一些对象,而后完成应用服务的调用,返回前端所须要的格式的对象。json

2.产品数据访问上下文、仓储接口、产品上下文仓储接口等须要经过依赖注入框架来获取特定的实现类,依赖注入框架能够采用Asp.net Core自带的,也能够采用Unity等框架。这里略去了依赖注入框架的具体实现,能够在公众号内查看。小程序

3.若是在调用应用服务可能抛出异常时,须要详细指明每一个catch与抛出的内容。后端

当后端接口完成后,做为后端开发人员,咱们须要写单元测试来完成对后端接口的调用,并尝试获得指望的结果。咱们在这里采用MSTest,你也可使用XUnit。微信小程序

上架产品单元测试:

HttpClient httpclient;       

    [TestMethod]
    public void AddProductTest()
    {
        httpclient = new HttpClient();
        var addproductspudto = new AddProductSPUDTO();
        addproductspudto.SPUName = "XXX石榴露";
        addproductspudto.SPUDesc = "XXX精华石榴露,用于养生";
        addproductspudto.SKUSpecs = new List<string>();
        addproductspudto.SKUSpecs.Add("每瓶50毫升");
        addproductspudto.SKUSpecs.Add("每瓶100毫升");
        addproductspudto.SKUUnits = new List<string>();
        addproductspudto.SKUUnits.Add("瓶");
        addproductspudto.SKUUnits.Add("瓶");
        addproductspudto.SKUPvs = new List<decimal>();
        addproductspudto.SKUPvs.Add(120);
        addproductspudto.SKUPvs.Add(300);
        addproductspudto.SKUDealerPrices = new List<decimal>();
        addproductspudto.SKUDealerPrices.Add(3000);
        addproductspudto.SKUDealerPrices.Add(4000);
        var fs = new FileStream(@"c:\test.jpg", FileMode.Open, FileAccess.Read);
        var imgbytes = new byte[fs.Length];
        fs.Read(imgbytes, 0, Convert.ToInt32(fs.Length));
        fs.Close();
        addproductspudto.SKUImages = new List<byte[]>();
        addproductspudto.SKUImages.Add(imgbytes);
        addproductspudto.SKUImages.Add(imgbytes);

        string json = JsonConvert.SerializeObject(addproductspudto);
        HttpContent httpcontent = new StringContent(json);
        httpcontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = httpclient.PostAsync("http://localhost:2209/api/Product/AddProduct", httpcontent).Result;
        var responsevalue = response.Content.ReadAsStringAsync().Result;
        var responsemsg = JsonConvert.DeserializeObject<ResultEntity<bool>>(responsevalue).Msg;
        Assert.AreEqual("上架产品成功!", responsemsg);
    }
[TestMethod]
    public void AddProductTest()
    {
        httpclient = new HttpClient();
        var addproductspudto = new AddProductSPUDTO();
        addproductspudto.SPUName = "XXX面膜";
        addproductspudto.SPUDesc = "XXX面膜,用于护肤";
        addproductspudto.SKUSpecs = new List<string>();
        addproductspudto.SKUSpecs.Add("每盒5张");
        addproductspudto.SKUSpecs.Add("每盒10张");
        addproductspudto.SKUUnits = new List<string>();
        addproductspudto.SKUUnits.Add("盒");
        addproductspudto.SKUUnits.Add("盒");
        addproductspudto.SKUPvs = new List<decimal>();
        addproductspudto.SKUPvs.Add(200);
        addproductspudto.SKUPvs.Add(350);
        addproductspudto.SKUDealerPrices = new List<decimal>();
        addproductspudto.SKUDealerPrices.Add(5000);
        addproductspudto.SKUDealerPrices.Add(8000);
        var fs = new FileStream(@"c:\test1.jpg", FileMode.Open, FileAccess.Read);
        var imgbytes = new byte[fs.Length];
        fs.Read(imgbytes, 0, Convert.ToInt32(fs.Length));
        fs.Close();
        addproductspudto.SKUImages = new List<byte[]>();
        addproductspudto.SKUImages.Add(imgbytes);
        addproductspudto.SKUImages.Add(imgbytes);

        string json = JsonConvert.SerializeObject(addproductspudto);
        HttpContent httpcontent = new StringContent(json);
        httpcontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = httpclient.PostAsync("http://localhost:2209/api/Product/AddProduct", httpcontent).Result;
        var responsevalue = response.Content.ReadAsStringAsync().Result;
        var responsemsg = JsonConvert.DeserializeObject<ResultEntity<bool>>(responsevalue).Msg;
        Assert.AreEqual("上架产品成功!", responsemsg);
    }
复制代码

有了单元测试,咱们后端开发人员就能够验证是否后端接口与整个用例是不是正常的,另外单元测试也能够做为每日自动构建的一部分。api

DDD实战进阶视频请关注微信公众号:MSSHCJ微信

相关文章
相关标签/搜索