领域驱动设计DDD与微服务实战案例进阶

领域驱动设计实战进阶第一波(七):实现产品上下文接口与测试

2018-05-08  本文已影响16人  malaoko

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

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

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

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

实现上下产品接口:

[Produces("application/json")]

    [Route("api/Product")]

    publicclass ProductController : Controller

    {

        ServiceLocator servicelocator =new ServiceLocator();

        [HttpPost]

        [Route("AddProduct")]

        publicResultEntity AddProduct([FromBody] AddProductSPUDTO addproductspudto)

        {

            varresult =newResultEntity();

            varproductdbcontext = servicelocator.GetService();

            varirepository = servicelocator.GetService(newParameterOverrides { {"context", productdbcontext } });

            variproductrepository=servicelocator.GetService(newParameterOverrides { {"context", productdbcontext } });

            varaddproductspuusecase =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。

上架产品单元测试:

HttpClient httpclient;     

        [TestMethod]

        publicvoid AddProductTest()

        {

            httpclient =new HttpClient();

            varaddproductspudto =new AddProductSPUDTO();

            addproductspudto.SPUName ="XXX石榴露";

            addproductspudto.SPUDesc ="XXX精华石榴露,用于养生";

            addproductspudto.SKUSpecs =newList();

            addproductspudto.SKUSpecs.Add("每瓶50毫升");

            addproductspudto.SKUSpecs.Add("每瓶100毫升");

            addproductspudto.SKUUnits =newList();

            addproductspudto.SKUUnits.Add("瓶");

            addproductspudto.SKUUnits.Add("瓶");

            addproductspudto.SKUPvs =newList();

            addproductspudto.SKUPvs.Add(120);

            addproductspudto.SKUPvs.Add(300);

            addproductspudto.SKUDealerPrices =newList();

            addproductspudto.SKUDealerPrices.Add(3000);

            addproductspudto.SKUDealerPrices.Add(4000);

            varfs =newFileStream(@"c:\test.jpg", FileMode.Open, FileAccess.Read);

            varimgbytes =newbyte[fs.Length];

            fs.Read(imgbytes, 0, Convert.ToInt32(fs.Length));

            fs.Close();

            addproductspudto.SKUImages =newList();

            addproductspudto.SKUImages.Add(imgbytes);

            addproductspudto.SKUImages.Add(imgbytes);

            stringjson = JsonConvert.SerializeObject(addproductspudto);

            HttpContent httpcontent =new StringContent(json);

            httpcontent.Headers.ContentType =newMediaTypeHeaderValue("application/json");

            varresponse = httpclient.PostAsync("http://localhost:2209/api/Product/AddProduct", httpcontent).Result;

            varresponsevalue = response.Content.ReadAsStringAsync().Result;

            varresponsemsg = JsonConvert.DeserializeObject>(responsevalue).Msg;

            Assert.AreEqual("上架产品成功!", responsemsg);

        }

[TestMethod]

        publicvoid AddProductTest()

        {

            httpclient =new HttpClient();

            varaddproductspudto =new AddProductSPUDTO();

            addproductspudto.SPUName ="XXX面膜";

            addproductspudto.SPUDesc ="XXX面膜,用于护肤";

            addproductspudto.SKUSpecs =newList();

            addproductspudto.SKUSpecs.Add("每盒5张");

            addproductspudto.SKUSpecs.Add("每盒10张");

            addproductspudto.SKUUnits =newList();

            addproductspudto.SKUUnits.Add("盒");

            addproductspudto.SKUUnits.Add("盒");

            addproductspudto.SKUPvs =newList();

            addproductspudto.SKUPvs.Add(200);

            addproductspudto.SKUPvs.Add(350);

            addproductspudto.SKUDealerPrices =newList();

            addproductspudto.SKUDealerPrices.Add(5000);

            addproductspudto.SKUDealerPrices.Add(8000);

            varfs =newFileStream(@"c:\test1.jpg", FileMode.Open, FileAccess.Read);

            varimgbytes =newbyte[fs.Length];

            fs.Read(imgbytes, 0, Convert.ToInt32(fs.Length));

            fs.Close();

            addproductspudto.SKUImages =newList();

            addproductspudto.SKUImages.Add(imgbytes);

            addproductspudto.SKUImages.Add(imgbytes);

            stringjson = JsonConvert.SerializeObject(addproductspudto);

            HttpContent httpcontent =new StringContent(json);

            httpcontent.Headers.ContentType =newMediaTypeHeaderValue("application/json");

            varresponse = httpclient.PostAsync("http://localhost:2209/api/Product/AddProduct", httpcontent).Result;

            varresponsevalue = response.Content.ReadAsStringAsync().Result;

            varresponsemsg = JsonConvert.DeserializeObject>(responsevalue).Msg;

            Assert.AreEqual("上架产品成功!", responsemsg);

        }

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

QQ讨论群:309287205

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

上一篇 下一篇

猜你喜欢

热点阅读