上節内容:
本節内容:
1:簡述元件設計的過程及思路及部分重點源碼講解
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();
}
這段代碼裡,包含了幾種優化思路:
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資料。
到這裡,并未實作綁定賬号,于是我開始思考:
3.3 oauth2 綁定網站的賬号實作第三方登陸:
如何和自己的網站的賬号實作綁定?
在原來網站的資料庫裡,添加字段?或者建立新表,再進行設計?
考慮到這樣的設計,和網站代碼結合度必然很深,不可能做到通用型,而且不同網站,用的是不同的資料庫,那得編寫多少種不同的腳本?
是以思前想後,将資料外置存儲在外部文本,考慮到cyq.data v5已經接近完美的支援文本資料庫及codefirst操作,是以引用它做為預設的外置資料庫操作類。
當然拿到源碼後,如果對于外存儲過塊需要調整或使用其它架構,這個自行操作了,不幹涉内政。
内置的文本資料庫解決方案:
如果對比上面的源碼截圖,你應該發現,是以類都提到了,隻剩下最後一個: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及設計的是文本資料庫,是以不用去相容不同網站的資料庫,自動生成文本資料庫外置,隻需要好好玩這個實體就可以了。
簡單的就介紹到這了,設計并不複雜,代碼量并不多,方法和成員也很少。
二:源碼下載下傳
三:擴充機制說明
看完本文,下完源碼,也許您可能會有以下功能需要進行調整,這裡給出指導與說明:
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兩個方法即可,然後自己另外存儲資料媒體。
不管是哪種,對于有點開發經驗的新老手來說,都是相對比較簡單。
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:
http://www.cnblogs.com/cyq1162/archive/2012/11/07/2756848.html