領域驅動設計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微信

相關文章
相關標籤/搜索