1/2页12 跳转到查看:1340
发新话题 回复该主题

【原创】从2个Admin类谈起

【原创】从2个Admin类谈起

    如果大家细心,会发现在项目NetCMS.Content里有一个Admin类,而在NetCMS.DALSQLServer项目里同样也存在一个Admin,那么这两个是否存在区别,如果存在区别到底有何区别?
答案肯定是有区别,要说出其中的道理,却需要一番周折。诸君请看:
NetCMS.Content中,定义的Admin类比较简单而且代码较少,列在下面:

using System;


using System.Collections.Generic;


using System.Data;


using NetCMS.Model;


using NetCMS.DALFactory;


namespace NetCMS.Content


{



public class Admin



{



private IAdmin ac;



public Admin()



{



ac = DataAccess.CreateAdmin();



}



public void Lock(string id)



{




ac.Lock(id);



}



public void UnLock(string id)



{



ac.UnLock(id);



}



public void Del(string id)



{



ac.Del(id);



}



public DataTable GetAdminGroupList()



{




DataTable dt = ac.GetAdminGroupList();



return dt;



}



public DataTable GetSiteList()



{



DataTable dt = ac.GetSiteList();



return dt;



}



public int Add(NetCMS.Model.AdminInfo aci)



{



int result = ac.Add(aci);



return result;



}



public int Edit(NetCMS.Model.AdminInfo aci)



{



int result = ac.Edit(aci);



return result;



}



public DataTable GetAdminInfo(string id)



{



DataTable dt = ac.GetAdminInfo(id);



return dt;



}




///
<summary>



///
得到管理员的权限列表



///
</summary>



///
<param name="UserNum"></param>



///
<param name="Id"></param>



///
<returns></returns>



public string GetAdminPopList(string UserNum,int Id)



{



return ac.GetAdminPopList(UserNum, Id);



}




public void UpdatePOPlist(string UserNum, int Id, string PopLIST)



{




ac.UpdatePOPlist(UserNum, Id, PopLIST);



}



///
<summary>



///
得到左右管理员列表



///
</summary>



///
<returns></returns>



public DataTable getAdmininfoList()



{



return ac.getAdmininfoList();



}



}


}




不知各位看了这段代码会不会想到一个名词“工厂模式”,如果你想到了,基本就不用看了,否则,你在接着看。
那么,在这里给大家解释一下工厂模式:
——MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说要一个汉堡,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
就我们这个Admin而言,是对管理员进行管理的,可是Admin本身干什么了?她没有干什么,而实际工作全市ac那个家伙干的。那么ac是谁?
Ac就是那个制造产品的工厂。。。但是大家发现ac是一个借口类型:
private IAdmin ac;

这就对了,其实上面对工厂模式的说法过于笼统,如果说白了,其实就是把对象的实例花放在子类里面去实现,这里的ac实际上是一个工厂的创建者,他负责实例化。实例化什么?工厂生产的产品是什么?呵呵,其实就是Admin!糊涂了?:)还是建议你找点关于设计模式的书看下工厂模式,推荐HeadFirst设计模式
那么我们下面看看IAdmin都干什么了:

using System;


using System.Collections.Generic;


using System.Data;


using System.Reflection;



namespace NetCMS.DALFactory


{



public interface IAdmin



{



void Lock(string id);



void UnLock(string id);



void Del(string id);



DataTable GetAdminGroupList();



DataTable GetSiteList();



int Add(NetCMS.Model.AdminInfo aci);



int Edit(NetCMS.Model.AdminInfo aci);



DataTable GetAdminInfo(string id);



string GetAdminPopList(string UserNum, int Id);



void UpdatePOPlist(string UserNum, int Id, string PopLIST);



DataTable getAdmininfoList();



}



public sealed partial class DataAccess



{



public static IAdmin CreateAdmin()



{



string className = path + ".Admin";



return (IAdmin)Assembly.Load(path).CreateInstance(className);



}



}


}
在上面代码中,只是给出了IAdmin的定义,但是你要注意下面的DataAccess这个家伙,他的返回值类型可是IAdmin,而在上面的Admin初始化的时候使用的正式这个类:


ac = DataAccess.CreateAdmin();


再看CreateAdmin方法,这里你需要知道的是,在这定义的DateAccess不是完整的,你看到path这个变量时就应该知道。那么我们把它补全:

using System.Reflection;


using System.Configuration;



namespace NetCMS.DALFactory


{



public sealed partial class DataAccess



{



private static readonly string path =NetCMS.Config.UIConfig.WebDAL;





public
DataAccess() { }



}


}
呵呵,在这里你看到了path是什么东西,不妨我们看看path的值,怎么看?不知道?需要去看UIConfig的定义的,不过这个简单,我想大家都能找到这个,那么,我把这个结果给大家。
。。。。。。

public class UIConfig



{



public static string WebDAL = ConfigurationManager.AppSettings["WebDAL"];



public static string dataRe = ConfigurationManager.AppSettings["dataRe"];



public static string mssql = ConfigurationManager.AppSettings["mssql"];

。。。。。。
显然,从AppSetting节可以找到WebDAL这个节点。看看去:

<appSettings>



<add key="dataRe" value="NT_" />



<add key="WebDAL" value="NetCMS.DALSQLServer" />



<add key="mssql" value="1" />


</appSettings>


可以看出,path= NetCMS.DALSQLServer,再向上看,
string className = path + ".Admin";
可知,className= NetCMS.DALSQLServer.Admin,可是这能说明什么问题?
好了,我们的题目是从2个Admin说起,上面一直在说第一个,现在第二个出来了,他是干什么的?实际行这个是真正干活的那个。不妨你去看看他的代码,
return (IAdmin)Assembly.Load(path).CreateInstance(className);
这个是C#中的反射,呵呵,知道吧,使用反射可以完成的功能是?请你去看看相关资料吧。
那么现在你想明白了么,为什么这样做?

如果你想明白了,请回复给我。

给大家说这个,是让大家知道,在NetCMS中工厂模式的使用,这个模式可能是最常用的一个,好处么,主要是松耦合对象之间的关系。我们可以考虑下,如果现在换成Access数据库,是不是写一个使用Access数据库的Admin类,通过修改配置文件就可以完成数据库的转化,而不用修改代码?(当然,还要有其他的工作要做,但是至少这个Admin类(第一个)不需要去改动)




说的有点乱,可能是地震害得,先这样吧。
最后编辑586 最后编辑于 2008-05-15 15:22:54
好好学习

TOP

 

回复:从2个Admin类谈起

yusam79 ,你是呕象,

TOP

 

回复 2F 386 的帖子

你是谁呢?..我猜猜猜...
好好学习

TOP

 

回复:从2个Admin类谈起

嘿嘿,你文笔和分析太好了,以后向你学习

TOP

 

回复: 【原创】从2个Admin类谈起



引用:
原帖由 yusam79 于 2008-5-15 13:58:00 发表
你是谁呢?..我猜猜猜... 



哈哈,我大笑,我大声的笑,哈哈。。。。

顺便,这好像是“精华帖”哦

TOP

 

回复:【原创】从2个Admin类谈起

NetCMS具体应该是简单工厂模式,理解工厂模式其实就是现实中的工厂,比如手机工厂,主要是生产各种类型的手机,而如果要生产“康佳”手机,只要通过接口告诉工厂所要的类型,工厂就返回“康佳”这个类型的手机。 这就是我对简单工厂模式的理解了。
【亿数通科技】HTPC体验中心 http://www.ms880.com
用NetCMS重新改版中....

TOP

 

回复:【原创】从2个Admin类谈起

在这两个类中, IAdmin 是接口类,而NetCMS.DALSQLServer类中的admin是实现接口的方法类,接口封装达到的目的就是低耦合高内聚。
【亿数通科技】HTPC体验中心 http://www.ms880.com
用NetCMS重新改版中....

TOP

 

回复:【原创】从2个Admin类谈起

以为你要讲说啥子呢?

TOP

 

回复:【原创】从2个Admin类谈起

C#的反射好好学习一下,,谢谢!!!

TOP

 

回复:【原创】从2个Admin类谈起

再来一个!
今日我为NetCMS而骄傲,明日NetCMS因我而自豪!

TOP

 
1/2页12 跳转到
发表新主题 回复该主题