|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那做企业软件是不是最好用J2EE?本节内容:
1:简述组件计划的历程及思绪及部分重点源码解说
2:源码下载
3:扩大机制申明
附源码截图:等会看以下思绪时,能够对比着看:
一:简述组件计划的历程及思绪
1:为何想到弄成组件?
当反复的代码或类似的事务>=2个时,我城市想一下,是不是还大概有第3个,第4个邻近的,假如有,就会一致处置,组件就是计划的再通用一些。
2:自己计划组件的准绳?
2.1:让用户以最复杂的体例利用或挪用组件,编写代码量最小化;
2.2:一切的计划,都参考第2.1点。
3:自己组件计划的复杂思绪历程:(5行代码的计划思绪)
3.1:用户的操纵UI计划:
如上图的第三方受权上岸怎样展现?
在html里间接写逝世?感到不给力,并且假如扩大多几个第三方上岸时,又要往组合网址,是件贫苦事。
以是我想到了应当有UI类,应当有个GetHtml(),如许来办理让挪用更复杂。
完成UI.GetHtml()办法:
这里也是有点常识点的,为了让代码简便化,我花了很多工夫思索,经由过程优秀的代码组合计划,削减代码量的编写。
因而,我用了一个经常使用办法,来优化这类计划:
publicstaticstringGetHtml()
{
stringlink="<ahref=http://www.kuqin.com/shuoit/20131026/"{0}"target="_blank">";
StringBuildersb=newStringBuilder();
foreach(KeyValuePair<string,OAuth2Base>obinOAuth2Factory.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);
}
}
returnsb.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里能够猎取一切受权范例举行遍历组装。
代码:
staticDictionary<string,OAuth2Base>_ServerList;
///<summary>
///猎取一切的范例(新开辟的OAuth2必要到这里注册增加一下)
///</summary>
internalstaticDictionary<string,OAuth2Base>ServerList
{
get
{
if(_ServerList==null)
{
_ServerList=newDictionary<string,OAuth2Base>(StringComparer.OrdinalIgnoreCase);
_ServerList.Add(OAuthServer.SinaWeiBo.ToString(),newSinaWeiBoOAuth());//新浪微博
_ServerList.Add(OAuthServer.QQ.ToString(),newQQOAuth());//QQ微博
}
return_ServerList;
}
}
全体的计划其实不庞大,只需完成后,就能够完成受权,并失掉第三方的token和openid数据。
到这里,并未完成绑定账号,因而我入手下手思索:
3.3OAuth2绑定网站的账号完成第三方上岸:
怎样和本人的网站的账号完成绑定?
在本来网站的数据库里,增加字段?大概创立新表,再举行计划?
思索到如许的计划,和网站代码分离度一定很深,不成能做到通用型,并且分歧网站,用的是分歧的数据库,那得编写几种分歧的剧本?
以是思前想后,将数据外置存储在内部文本,思索到CYQ.DataV5已靠近完善的撑持文本数据库及CodeFirst操纵,以是援用它做为默许的外置数据库操纵类。
固然拿到源码后,假如关于外存储过块必要调剂或利用别的框架,这个自行操纵了,不干与外交。
内置的文本数据库办理计划:
假如对照下面的源码截图,你应当发明,以是类都提到了,只剩下最初一个:OAuth2Account,它就是完成和网站绑定的罪人。
代码也很复杂的说(除承继自OrmBase和机关函数指定了表名和文本存储路径,基础上就是一个罕见的实体类了):
publicclassOAuth2Account:CYQ.Data.Orm.OrmBase
{
publicOAuth2Account()
{
base.SetInit(this,"OAuth2Account","TxtPath={0}App_Data");
}
privateint_ID;
publicintID
{
get
{
return_ID;
}
set
{
_ID=value;
}
}
privatestring_OAuthServer;
///<summary>
///受权的服务范例
///</summary>
publicstringOAuthServer
{
get
{
return_OAuthServer;
}
set
{
_OAuthServer=value;
}
}
privatestring_Token;
///<summary>
///保留的Token
///</summary>
publicstringToken
{
get
{
return_Token;
}
set
{
_Token=value;
}
}
privatestring_OpenID;
///<summary>
///保留对应的ID
///</summary>
publicstringOpenID
{
get
{
return_OpenID;
}
set
{
_OpenID=value;
}
}
privatestring_BindAccount;
privateDateTime_ExpireTime;
///<summary>
///过时工夫
///</summary>
publicDateTimeExpireTime
{
get
{
return_ExpireTime;
}
set
{
_ExpireTime=value;
}
}
privatestring_NickName;
///<summary>
///前往的第三方昵称
///</summary>
publicstringNickName
{
get
{
return_NickName;
}
set
{
_NickName=value;
}
}
privatestring_HeadUrl;
///<summary>
///前往的第三方账号对应的头像地点。
///</summary>
publicstringHeadUrl
{
get
{
return_HeadUrl;
}
set
{
_HeadUrl=value;
}
}
///<summary>
///绑定的账号
///</summary>
publicstringBindAccount
{
get
{
return_BindAccount;
}
set
{
_BindAccount=value;
}
}
}
在OAuth2Base基类里有两个和内置文本数据库打交首的函数:GetBindAccount和SetBindAccount:
///增加绑定账号
///</summary>
///<paramname="bindAccount"></param>
///<returns></returns>
publicboolSetBindAccount(stringbindAccount)
{
boolresult=false;
if(!string.IsNullOrEmpty(openID)&&!string.IsNullOrEmpty(token)&&!string.IsNullOrEmpty(bindAccount))
{
using(OAuth2Accountoa=newOAuth2Account())
{
if(!oa.Exists(string.Format("OAuthServer={0}andOpenID={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);
}
}
}
returnresult;
}
因为是CodeFirst及计划的是文本数据库,以是不必往兼容分歧网站的数据库,主动天生文本数据库外置,只必要好好玩这个实体就能够了。
复杂的就先容到这了,计划其实不庞大,代码量其实不多,办法和成员也很少。
二:源码下载
源码点击下载:
OAuth2_Source.rar(
)
三:扩大机制申明
看完本文,下完源码,大概您大概会有以下功效必要举行调剂,这里给出引导与申明:
1:界面UI的调剂,详细看UI类,修改下便可。
2:增添受权品种:承继OAuth2Base,参考已有的新浪微博和QQ举行操纵,固然也能够接洽我让我增加。
3:怎样获得绑定后的表数据:只需挪用newOAuth2Account().Select().Bind(列表);
我也不知道,我原来理解的,NET就是C++编程,只是与net网页编程相对,呵呵。以为.ET就是高级C++编程。 |
|