前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

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

作者头像
用户1910585
发布2018-07-04 15:08:04
5280
发布2018-07-04 15:08:04
举报
文章被收录于专栏:领域驱动设计DDD实战进阶

前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能。在实际的项目中,多种前端的形态比如PC Web、

微信小程序、原生APP等要调用后端的功能,通常要将后端的功能包装成RESTFUL风格,这样前端就可以使用Http Get或Post方式调用后端的功能,所以这篇文章我们先来完成后端

的Asp.net Core WebApi,通过WebApi将上架产品的功能暴露出去。

实现上下产品接口:

代码语言:javascript
复制
[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.首先大家看到接口层是非常薄的一层,它并不包含业务逻辑和数据访问,它只是初始化一些对象,然后完成应用服务的调用,返回前端所需要的格式的对象。

2.产品数据访问上下文、仓储接口、产品上下文仓储接口等需要通过依赖注入框架来获取特定的实现类,依赖注入框架可以采用Asp.net Core自带的,也可以采用Unity等框架。这里略去了依赖注入框架

的具体实现,可以在公众号内查看。

3.如果在调用应用服务可能抛出异常时,需要详细指明每个catch与抛出的内容。

当后端接口完成后,作为后端开发人员,我们需要写单元测试来完成对后端接口的调用,并尝试得到期望的结果。我们在这里采用MSTest,你也可以使用XUnit。

上架产品单元测试:

代码语言:javascript
复制
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);
        }

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档