天天看點

實體類隐式轉換手記

說明:

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