.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;
}
}
}
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 进入详细评论页>>




