说明:
有的时候因为项目解决方案结构需要,为了避免类库间"闭环"引用,需要将一些第三方API统一放在一个特定的类库中进行调用,如果不用隐式转换类型的话,很难避免闭环引用,最常见的莫过于实体类的引用;
这次项目中是为了剥离在诸如BLL、DAL层对API的引用:
以TOP.API.DOMAIN中的实体类为例(以Area类为例)
1.首先创建一个跟Top.Api.Domain.Area结构相同的一个类TMALL_AreaInfo
using System;
namespace TMALL_Baishop.Model
{
/// <summary>
/// 天猫地址区域模型
/// </summary>
public class TMALL_AreaInfo
{
/// <summary>
/// 标准行政区域代码.参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20120105_402777427.htm
/// </summary>
public Int64 ID { get; set; }
/// <summary>
/// 区域类型.area区域
/// 1:country/国家;
/// 2:province/省/自治区/直辖市;
/// 3:city/地区(省下面的地级市);
/// 4:district/县/市(县级市)/区;
/// abroad:海外.
/// 比如北京市的area_type = 2,朝阳区是北京市的一个区,所以朝阳区的area_type = 4.
/// </summary>
public Int64 Type { get; set; }
/// <summary>
/// 地域名称.如北京市,杭州市,西湖区,每一个area_id 都代表了一个具体的地区.
/// </summary>
public String Name { get; set; }
/// <summary>
/// 父节点区域标识.如北京市的area_id是110100,朝阳区是北京市的一个区,所以朝阳区的parent_id就是北京市的area_id.
/// </summary>
public Int64 ParentID { get; set; }
/// <summary>
/// 具体一个地区的邮编
/// </summary>
public String Zip { get; set; }
public static implicit operator TMALL_AreaInfo(Top.Api.Domain.Area value) //这里用implicit可以,但个人觉得用explicit比较好
{
if (value == null)
return null;
return new TMALL_AreaInfo //如果在该实体类中还存在其他外键对象(数组),那么在这个外键对象中仍然要做隐式转换处理
{ //然后再在匿名初始化器中进行赋值
ID = value.Id,
Type = value.Type,
Name = value.Name,
ParentID = value.ParentId,
Zip = value.Zip
};
}
}
}
2.Top.Api 中方法:
/// <summary>
/// 查询地址区域
/// 查询标准地址区域代码信息 参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20100623_402652267.htm
/// </summary>
public static IList<TMALL_AreaInfo> AreasGet()
{
ITopClient client = new DefaultTopClient(URL, APP_KEY, APP_SECRET);
AreasGetRequest req = new AreasGetRequest();
req.Fields = "id,type,name,parent_id,zip";
AreasGetResponse response = client.Execute(req, SESSION_KEY);
return response.Areas.Select(ent => (TMALL_AreaInfo)ent).ToList(); //这里若不进行强转,则response.Areas返回的是Top.Api.Domain.Areas
}