說明:
有的時候因為項目解決方案結構需要,為了避免類庫間"閉環"引用,需要将一些第三方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
}