<b>上節内容:</b>
本節内容:
<b></b>
<b>1:簡述元件設計的過程及思路及</b><b>部分重點源碼講解</b>
2:源碼下載下傳
3:擴充機制說明
附源碼截圖:等會看以下思路時,可以對照着看:
一:簡述元件設計的過程及思路
1:為什麼想到弄成元件?
當重複的代碼或相似的事件>=2個時,我都會想一下,是否還可能有第3個,第4個相近的,如果有,就會統一處理,元件就是設計的再通用一些。
2:本人設計元件的原則?
2.1:讓使用者以最簡單的方式使用或調用元件,編寫代碼量最小化;
2.2:所有的設計,都參考第2.1點。
3:本人元件設計的簡單思路過程:(5行代碼的設計思路)
3.1:使用者的操作UI設計:
如上圖的第三方授權登陸如何展示?
在html裡直接寫死?感覺不給力,而且如果擴充多幾個第三方登陸時,又要去組合網址,是件麻煩事。
是以我想到了應該有UI類,應該有個GetHtml(),這樣來解決讓調用更簡單。
實作UI.GetHtml()方法:
這裡也是有點知識點的,為了讓代碼簡潔化,我花了不少時間思考,通過良好的代碼組合設計,減少代碼量的編寫。
于是,我用了一個常用方法,來優化這種設計:
public static string GetHtml()
{
string link = "<a href=\"{0}\" target=\"_blank\"><img src=\"{1}\" /></a>";
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string,OAuth2Base> ob in OAuth2Factory.ServerList)
{
if (!string.IsNullOrEmpty(ob.Value.AppKey))
{
sb.AppendFormat(link, string.Format(ob.Value.OAuthUrl, ob.Value.AppKey,System.Web.HttpUtility.UrlEncode(ob.Value.CallbackUrl), ob.Key), ob.Value.ImgUrl);
}
}
return sb.ToString();
}
<b> 這段代碼裡,包含了幾種優化思路:</b>
1:應該有一個方法,可以擷取目前所有的授權類型: OAuth2Factory.ServerList。
2:授權類型應該包括一些配置項,可以直接讀取: ob.Value.OAuthUrl, ob.Value.AppKey,ob.Value.ImgUrl
在想出這種方法時,還沒開始設計OAuth2授權相關類,是以當時還隻是僞代碼,随着OAuth2類被完善,這裡的代碼就簡單成型了。
OK,讓我們回頭看看:
3.2:OAuth授權類設計(傳說的抽象+工廠):
和資料庫多資料庫支援的設計思路如出一折。
1:應該有個基類:OAuth2Base(包括通用的方法和屬性)
2:繼續基類 OAuth2Base,實作不同的授權:SinaWeiboOAuth、QQAuth、其它...等!
3:有個工廠OAuth2Factory來傳回目前的授權類型(正如資料庫元件來設計目前是操作哪種資料庫類型)
4:有個小工具類Tool,放幾個常用的小方法。
在OAuth2Factory裡,我們通過預先注冊所有的子類授權,來彙總所有的授權類型。
是以GetHtml裡可以擷取所有授權類型進行周遊組裝。
代碼:
static Dictionary<string, OAuth2Base> _ServerList;
/// <summary>
/// 擷取所有的類型(新開發的OAuth2需要到這裡注冊添加一下)
/// </summary>
internal static Dictionary<string, OAuth2Base> ServerList
get
if (_ServerList == null)
_ServerList = new Dictionary<string, OAuth2Base>(StringComparer.OrdinalIgnoreCase);
_ServerList.Add(OAuthServer.SinaWeiBo.ToString(), new SinaWeiBoOAuth());//新浪微網誌
_ServerList.Add(OAuthServer.QQ.ToString(), new QQOAuth());//QQ微網誌
return _ServerList;
}
}
整體的設計并不複雜,隻要實作後,就可以實作授權,并得到第三方的token和openid資料。
到這裡,并未實作綁定賬号,于是我開始思考:
<b>3.3 OAuth2 </b><b>綁定</b><b>網站的賬号實作第三方登陸:</b>
<b>如何和自己的網站的賬号實作綁定?</b>
在原來網站的資料庫裡,添加字段?或者建立新表,再進行設計?
考慮到這樣的設計,和網站代碼結合度必然很深,不可能做到通用型,而且不同網站,用的是不同的資料庫,那得編寫多少種不同的腳本?
是以思前想後,将資料外置存儲在外部文本,考慮到CYQ.Data V5已經接近完美的支援文本資料庫及CodeFirst操作,是以引用它做為預設的外置資料庫操作類。
當然拿到源碼後,如果對于外存儲過塊需要調整或使用其它架構,這個自行操作了,不幹涉内政。
<b>内置的文本資料庫解決方案:</b>
如果對比上面的源碼截圖,你應該發現,是以類都提到了,隻剩下最後一個:OAuth2Account ,它就是實作和網站綁定的罪人。
代碼也很簡單的說(除了繼承自OrmBase和構造函數指定了表名和文本存儲路徑,基本上就是一個常見的實體類了):
public class OAuth2Account:CYQ.Data.Orm.OrmBase
{
public OAuth2Account()
base.SetInit(this, "OAuth2Account", "Txt Path={0}App_Data");
}
private int _ID;
public int ID
return _ID;
set
_ID = value;
private string _OAuthServer;
/// 授權的服務類型
public string OAuthServer
return _OAuthServer;
_OAuthServer = value;
private string _Token;
/// 儲存的Token
public string Token
return _Token;
_Token = value;
private string _OpenID;
/// 儲存對應的ID
public string OpenID
return _OpenID;
_OpenID = value;
private string _BindAccount;
private DateTime _ExpireTime;
/// 過期時間
public DateTime ExpireTime
return _ExpireTime;
_ExpireTime = value;
private string _NickName;
/// 傳回的第三方昵稱
public string NickName
return _NickName;
_NickName = value;
private string _HeadUrl;
/// 傳回的第三方賬号對應的頭像位址。
public string HeadUrl
return _HeadUrl;
_HeadUrl = value;
/// 綁定的賬号
public string BindAccount
return _BindAccount;
_BindAccount = value;
在OAuth2Base基類裡有兩個和内置文本資料庫打交首的函數:GetBindAccount和SetBindAccount:
/// 添加綁定賬号
/// <param name="bindAccount"></param>
/// <returns></returns>
public bool SetBindAccount(string bindAccount)
bool result = false;
if (!string.IsNullOrEmpty(openID) && !string.IsNullOrEmpty(token) && !string.IsNullOrEmpty(bindAccount))
using (OAuth2Account oa = new OAuth2Account())
if (!oa.Exists(string.Format("OAuthServer='{0}' and OpenID='{1}'", server, openID)))
{
oa.OAuthServer = server.ToString();
oa.Token = token;
oa.OpenID = openID;
oa.ExpireTime = expiresTime;
oa.BindAccount = bindAccount;
oa.NickName = nickName;
oa.HeadUrl = headUrl;
result = oa.Insert(CYQ.Data.InsertOp.None);
}
return result;
由于是CodeFirst及設計的是文本資料庫,是以不用去相容不同網站的資料庫,自動生成文本資料庫外置,隻需要好好玩這個實體就可以了。
<b>簡單的就介紹到這了,設計并不複雜,代碼量并不多,方法和成員也很少。</b>
二:源碼下載下傳

)
<b>三:擴充機制說明 </b>
看完本文,下完源碼,也許您可能會有以下功能需要進行調整,這裡給出指導與說明:
1:界面UI的調整,具體看UI類,改動下即可。
2:增加授權種類:繼承OAuth2Base,參考已有的新浪微網誌和QQ進行操作,當然也可以聯系我讓我添加。
3:如何取得綁定後的表資料:隻要調用new OAuth2Account().Select().Bind(清單);
4:更換授權存儲媒體,有兩種方式:
a:保留CYQ.Data V5版本,更換資料庫,隻需要修改OAuth2Account類的構造函數的資料庫連結更換為您現在使用的資料庫連結即可。
CYQ.Data V5版本目前僅支援以下資料庫(mssql、mysql、oracle、aceess、sqlite、txt、xml),前三種需要授權使用,後四種免費使用。
b:移除CYQ.Data V5版本,更換底層元件,您隻要重寫OAuth2Base中的 SetBindAccount和GetBindAccount兩個方法即可,然後自己另外存儲資料媒體。
不管是哪種,對于有點開發經驗的新老手來說,都是相對比較簡單。
本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/1052583,如需轉載請自行聯系原作者