前一篇文章我們介紹了如何將創建產品的領域邏輯與產品的持久化倉儲通過上架產品的用例組織起來,完成了一個功能。在實際的項目中,多種前端的形態比如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 = 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] 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); }
有了單元測試,我們后端開發人員就可以驗證是否后端接口與整個用例是否是正常的,另外單元測試也可以作為每日自動構建的一部分。
QQ討論群:309287205
DDD實戰進階視頻請關注微信公眾號: