DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)
前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能。在实际的项目中,多种前端的形态比如PC Web、
微信小程序、原生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 = ; result.Msg = "上架产品成功!"; } catch(Exception error) { result.ErrorCode = ; result.Msg = error.Message; } return result; } }
1.首先大家看到接口层是非常薄的一层,它并不包含业务逻辑和数据访问,它只是初始化一些对象,然后完成应用服务的调用,返回前端所需要的格式的对象。
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(); addproductspudto.SKUPvs.Add(); addproductspudto.SKUDealerPrices = new List<decimal>(); addproductspudto.SKUDealerPrices.Add(); addproductspudto.SKUDealerPrices.Add(); var fs = new FileStream(@"c:\test.jpg", FileMode.Open, FileAccess.Read); var imgbytes = new byte[fs.Length]; fs.Read(imgbytes, , 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); }
有了单元测试,我们后端开发人员就可以验证是否后端接口与整个用例是否是正常的,另外单元测试也可以作为每日自动构建的一部分。
DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)的更多相关文章
- DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)
在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对DDD的方法与架构已经有了初步的了解. 但是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容.从这篇文章 ...
- DDD实战进阶第一波(十四):开发一般业务的大健康行业直销系统(订单上下文应用服务用例与接口)
上一篇文章我们主要讲了订单上下文的领域逻辑,在领域逻辑中完成了订单项的计算逻辑.订单的计算逻辑以及如何生成相应的实体code,这篇文章我们通过 在应用服务中实现一个下单的用例,来将这些领域逻辑以及仓储 ...
- DDD实战进阶第一波(十三):开发一般业务的大健康行业直销系统(订单上下文领域逻辑)
前一篇文章主要讲了订单上下文的POCO模型,其中订单与订单项中有大量的值对象.这篇文章主要讲讲这些值对象以及订单项.订单相关的领域逻辑. 1.ProductSKUs值对象领域逻辑:ProductSKU ...
- DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)
本系列文章 DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述) DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一) 近年来,关于如何开发基于 ...
- DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)
要实现软件设计.软件开发在一个统一的思想.统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束. 虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍 ...
- DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)
这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...
- DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)
了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...
- DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)
从这篇文章开始,我们根据前面的DDD理论与DDD框架的约束,正式进入直销系统案例的开发. 本篇文章主要讲产品上下文中的领域层的主要实现,先简单讲下业务方面的需求:产品SPU与产品SKU,产品SPU主要 ...
- DDD实战进阶第一波(十五):开发一般业务的大健康行业直销系统(总结篇)
前面我们花了14篇的文章来给大家介绍经典DDD的概念.架构和实践.这篇文章我们来做一个完整的总结,另外生成一个Api接口文档. 一.DDD解决传统的开发的几大问题: 没有描述需求的设计模型:而是直接通 ...
- DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)
前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...
随机推荐
- python全栈开发-re模块(正则表达式)应用(字符串的处理)
一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串集指定规则:该 ...
- 新概念英语(1-63)Thank you, doctor.
新概念英语(1-63)Thank you, doctor. Who else is in bed today? why? A:How's Jimmy today? B:Better. Thank yo ...
- python常用运算符
1. / 浮点除法,就算分子分母都是int类型,也返回float类型,比如我们用4/2,返回2.0 2. // 整数除法,根据分子分母的不同组合,返回的值有差异. 正数//正数,取整,比如5//3,返 ...
- Python基础学习篇章四
一. Python数据类型之字典 1. 键的排序:for循环 由于字典不是序列,因此没有可靠的从左至右的顺序.这就导致当建立一个字典,将它打印出来,它的键也许会以与我们输入时的不同的顺序出现.有时候我 ...
- C#微信公众号——消息处理
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL. 一.接收POST请求,处理XML信息 public void ProcessRequest(HttpC ...
- highchart
highchart 1 2 #下载 https://www.highcharts.com/download a. 简单例子 <!DOCTYPE html> <html lang=&q ...
- 1.7 理解dropout
Dropout为什么有正则化的作用? 下面来直观理解一下. 上面讲到,dropout每次迭代都会让一部分神经元失活,这样使得神经网络会比原始的神经网络规模变小,因此采用一个较小神经网络好像和使用正则化 ...
- Extensions in UWP Community Toolkit - WebViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 WebView 提供的扩展 - WebViewExtensions,本篇我们结合代码详细讲解 WebView Ext ...
- linux-非root用户运行tomcat
# 前言:为什么要使用非root用户运行tomcat root用户启动tomcat有一个严重的问题,那就是tomcat具有root权限. 这意味着你的任何一个页面脚本(html/js)都具有root权 ...
- [LeetCode] Implement Magic Dictionary 实现神奇字典
Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...