.NET应用架构设计—用户端的防腐层作用及设计(6)
来源:未知 责任编辑:责任编辑 发表时间:2015-05-17 16:44 点击:次
我的第一感觉就是,显示逻辑已经基本上都是类型转换代码,而且这里我没有添加任何一个有关显示的逻辑,在这样的情况下都让代码急速膨胀了,可想而知,如果再在这些代码中加入显示逻辑,我们基本上很难在后期维护这些显示逻辑,而这些显示逻辑才是这个类的真正职责。
由此带来的问题就是重要的逻辑淹没在这些转换代码中,所以我们急需一个能够容纳这些转换代码的位置,也就是防腐层,在防腐层中我们专门来处理这些转换逻辑,当然我这里的例子是比较简单的,只包含了查询,真正的防腐层是很复杂的,它里面要处理的东西不亚于其他层面的逻辑处理。我们这里仅仅是在转换一些DTO对象而不是复杂的DomainModel对象。
5.将服务的DTO与显示端的ViewModel之间的转换放入防腐层
我们需要一个防腐层来处理这些转换代码,包括对后端服务的调用逻辑,将这部分代码移入防腐对象中之后会对我们后面重构很有帮助。
namespace OrderManager.Anticorrsive { using OrderManager.Port.Component; using OrderManager.Port.Models; using System.Collections.Generic; using System.Linq; /// <summary> /// OrderViewModel 防腐对象 /// </summary> public class OrderAnticorrsive : AnticorrsiveBase<OrderViewModel>, IOrderAnticorrsive { private readonly IOrderServiceClient orderServiceClient; private readonly IProductServiceClient productServiceClient; public OrderAnticorrsive(IOrderServiceClient orderServiceClient, IProductServiceClient productServiceClient) { this.orderServiceClient = orderServiceClient; this.productServiceClient = productServiceClient; } public OrderViewModel GetOrderViewModel(long oId) { var order = orderServiceClient.GetOrderByOid(oId); if (order == null && order.Items != null && order.Items.Count > 0) return null; var result = new OrderViewModel() { OId = order.OId, Address = order.Address, OName = order.OName, Items = new System.Collections.Generic.List<OrderItem>() }; if (order.Items.Count == 1) { var product = productServiceClient.GetProductByPid(order.Items[0].Pid);//调用单个获取商品接口 if (product != null) { result.Items.Add(ConvertOrderItem(order.Items[0], product)); } } else { List<long> pids = (from item in order.Items select item.Pid).ToList(); var products = productServiceClient.GetProductsByIds(pids);//调用批量获取商品接口 if (products != null) { result.Items = ConvertOrderItems(products, order.Items);//批量转换OrderItem类型 } } return result; } private static OrderItem ConvertOrderItem(OrderService.OrderItem orderItem, ProductService.Contract.Product product) { if (product == null) return null; return new OrderItem() { Number = orderItem.Number, OitemId = orderItem.OitemId, Pid = orderItem.Pid, Price = orderItem.Price, Product = new Product() { Pid = product.Pid, PName = product.PName, PGroup = product.PGroup, Production = product.Production } }; } private static List<OrderItem> ConvertOrderItems(List<ProductService.Contract.Product> products, List<OrderService.OrderItem> orderItems) { var result = new List<OrderItem>(); orderItems.ForEach(item => { var orderItem = ConvertOrderItem(item, products.Where(p => p.Pid == item.Pid).FirstOrDefault()); if (orderItem != null) result.Add(orderItem); }); return result; } } }
相关新闻>>
- 发表评论
-
- 最新评论 更多>>