|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如Java改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。asp.net 1、弁言
早在2001年,我就动手开辟一个ASP.NET在线动静板使用程序WebForums.NET。其目标是创立一个基于ASP.NET的动静板体系,并且该体系能够简单拔出到一个现有网站中。构建如许一个端对端使用程序的出格应战之一就是,要为客户供应一种体例以便可以把它集成到他们本人的体系中往。比方,一个在线论坛分明必要利用某种数据存储来存储用户信息、论坛、回寄信息等;可是,最好不要把客户锁定到一种特定的数据存储中。也就是说,你不该该说,"我的使用程序必需利用微软的SQLServer2000";由于如许的话,利用Oracle或Access的客户怎样会利用你的软件呢?
另外一个集成到客户现无数据中的成绩是,一切的在线论坛站点都供应用户帐户和一种创立新帐户的体例。典范情形下,这被建模为一个论坛架构(以一个数据库中的Users表情势存在)。可是,客户极可能已有他们本人的具有成千的用户帐户的数据库表。大概,一个客户大概想在一个外部网设置中利用该论坛,而且想利用举动目次而不是某种数据库表来认证和存储用户信息。因而,当一个论坛软件体系创立一个Users数据库表并对其客户说"这就是你存储用户的体例"时,那些已具有现有基本布局和用户数据的客户极可能会冷淡如许的软件。
因而,当你利用一种"生硬"的API构建一个体系时,会发生出格的应战。一种"生硬"的API不是供应一种体例来定制逻辑而是硬编码完成细节(比方,你必需利用SQLServer作为你的后端数据存储,且在这个数据库有一个Users表,并将在个中存储一切的用户信息)。但是,经由过程利用供应者计划形式,你能够容易地冲破这类"生硬"性。借助于供应者计划形式,体系架构师只必要界说API,至于编程功效则由体系来供应。关于一个在线论坛使用程序来讲,这大概包含一个具有比方Authenticate(username,password)和GetUserDetails(username)等办法的Users类。
供应者模子的优异在于客户完成计划能够指定一个体系应当利用的定制类。这类定制类必需完成体系的优秀界说的API;可是,它同意无缝地拔出任何定制完成。也就是说,一旦界说这个API,体系完成者能够创立一个利用SQLServer和一个Users表的默许的详细完成-年夜多半客户能够间接利用之而不用要作任何修正。那些有定制必要的客户(他们想利用Oracle或以别的一些体例存储用户数据)能够创立他们本人的类,该类供应需要的功效而且把它们拔出到这些客户的体系中。
实在,供应者计划形式被使用于全部ASP.NET2.0完成中。固然,网上也存在一些怎样在ASP.NET1.x使用程序中利用这一功效的教程。
在本文中,我们将具体切磋供应者模子并剖析怎样把它使用于ASP.NET2.0开辟中。
2、冲破"生硬"的API完成
在我初期的WebForums.NET开辟中,我熟悉到,这类"生硬"的API完成将会成为一个成绩。我的软件计划方针之一就是:尽量天真且可定制,而且利用户利用SQLServer,并且我的用户数据模子完成应当看起来充其量只是有些限定性。为了克制这些成绩,我构建了一个包括上面两部分的体系:
1.一组界说了体系的中心功效的笼统基类;
2.可以在运转时候静态地加载一个扩大笼统基类。详细地说,该代码卖力反省包括一个<ConfigSetting>节(该节中给出要利用的类的完整限制名)的Web.config文件。
借助于这一架构,我能够经由过程一系列笼统基类来界说体系的功效,并利用SQLServer2000和Users表来供应这些类的详细完成。满意这一设置的客户能够尽管利用该使用程序,而且统统将事情优秀,且不必要他们编写一行代码。但是,那些必要定制的开辟者们能够经由过程创立他们本人的派生自得当的笼统基类的类来完成。经由过程复杂地把该程序集放到使用程序的/bin目次并更新Web.config文件,他们可让体系利用这个新类。详细地说,WebForums.NET刊行中带有一个笼统基类DataProvider,它分明地枚举出了体系中的一切办法,相似以下:
publicabstractclassDataProvider
{
publicabstractboolAuthenticateUser(stringusername,stringpassword);
publicabstractUserGetUserInfo(stringusername);
...
publicstaticDataProviderInstance()
{
...
}
}
AuthenticateUser(username,password)和GetUserInfo(username)办法是体系界说的很多办法中的两个办法的代表。而静态Instance()办法是该DataProvider类的次要完成;它包括反省代表了WebForums.NET设置信息(该信息唆使体系要利用的类的全称限制名)的Web.config文件的代码。然后,该办法利用反射(弛缓冲)来创立该类的一个实例而且把它前往到体系。
WebForums.NET刊行中还带有一个派生自DataProvider基类的SqlDataProvider类,这个类供应分类办法的详细完成。比方,SqlDataProvider的一切办法都能够操纵存储于一个SQLServer2000数据库中的数据;与用户相干的办法能够与一个预界说的Users数据库表一同事情。一个想改动后端功效的客户能够创立他本人的派生自DataProvider的类,这些信息都能够展现于Web.config文件中(指明应当利用他们的定制类)。比方,WebForums.NET中的Web.config大概包含以下内容:
<WebForumsSettings>
<addkey="DataProviderAssemblyPath"value="path"/>
<addkey="DataProviderClassName"value="Namespace.Classname"/>
</WebForumsSettings>
默许情形下,这个设相信息援用伴同WebForums.NET一同刊行的SqlDataProvider类。但是,假如一个客户创立他本人的API完成,那末他能够供应本人的类的细节,而且体系会主动地入手下手利用他的完成来创立默许完成。
借助于这一架构,利用WebForums.NET的页面开辟者可使用以下所示的代码来认证一个用户:
if(DataProvider.Instance().AuthenticateUser(username,password))
//用户被认证
else
//用户名/口令有效!
当挪用DataProvider.Instance()办法时,下面的设置文件被反省而且前往得当类的一个实例。假如客户还没有创立他们本人的完成的话,这将是默许的SqlDataProvider类;而假如他们已完成的话,它将是他们本人的类。一旦DataProvider.Instance()办法前往一个得当的供应者实例,我们就能够复杂地挪用该API的成员(在这个例子中是AuthenticateUser())。
WebForums.NET供应者模子-一个初期的原型
相对微软倡议利用的供应者模子,Andy的供应者模子含有一些不敷。一方面,WebForums.NET中供应了单个笼统基类,一切的API界说都会萃在这个类中。其负面感化在于,假如一个客户仅想定制体系的一小部分,比方用户信息的存储体例,那末他必需供应该体系中一切办法的完成。一种更好的计划是,为体系中的每个逻辑实体创立一个笼统基类。比方,关于一个在线动静板使用程序来讲,它大概必要一些类,如UsersProvider,ForumsProvider,PostsProvider,等等。但是,在你供应给一个客户的供应者数量之间也存在一个均衡成绩。更多供应者同意更加仔细的体系定制,可是也会响应地进步请求的设置标志的数目。
别的,我已展现了对WebForums.NET的供应者模子完成代码的作了进一步改善,以便使其更类似于微软在ASP.NET2.0中所利用的代码。我以为,Andy的设法应当是供应者模子的前驱,只管微软的供应者模子完成更加明晰且更健壮一些。
一方面,WebForums.NET在2002年三月为微软所收买;另外一方面,RobHoward及其别人又在体系中到场了大批的新特性而且在ASP.NET论坛中以自在体例刊行它。TodayRob及其小构成员已把ASP.NET论坛酿成了一个CommunityServer(它几乎把博客、论坛、画廊、列表服务器、旧事浏览器等全体融为一体)。明天,Andy所创立的观点与完成被普遍使用于ASP.NET论坛和CommunityServer中,乃至被使用于很多中心ASP.NET2.0组件中。
3、供应者模子长处
供应者模子供应很多长处。起首,在代码和后端完成之间存在明晰的分别。不论认证一个用户的代码是针对一个SQLServer2000数据库的Users表仍是针关于一个举动目次存储,从页面开辟者的察看看来代码都是不异的:
DataProvider.Instance().AuthenticateUser(username,password);
并且,后端完成变更是通明的。
由于体系架构师被勉励创立默许的完成,以是供应者模子供应了两种天下的最好分离:假如对默许完成已对照中意,那末体系会按预期举行事情;关于必要定制体系的用户来讲,他们只管定制好了而不用搅扰现有代码或编程逻辑。这个计划形式也使得原型化和敏捷开辟简单很多。比方,在初期体系利用阶段,仅利用默许完成大概更简单。但是,今后你大概必要定制某些方面以便把该事情与你的公司的现有体系集成到一同。这时候,你能够经由过程供应者模子完成必要的定制。这意味着,不必要改动你的初期事情来反应后端完成的变更。
就象很多好的计划模子一样,供应者模子也供应了开辟者之间的职责分别。如许以来,一部分隔发者可使用他们精晓的体系API举行事情,而另外一部分隔发者能够专注于后端完成和定制义务开辟;并且,这两组职员能够事情在统一个体系上而不会互相搅扰。并且,假如他们所利用的体系是一种产业尺度(比方ASP.NET2.0),那末这两类义务中的妙技都能够被简单地移植到将来的事情中。
4、ASP.NET2.0供应者模子
ASP.NET2.0在全体其架构中都使用供应者模子。比方,它的很多子体系-会员,站点导航,本性化等都使用了供应者模子手艺。并且,每一个子体系都供应一种默许完成,但也能使客户定制其功效以满意他们本人的必要。比方,ASP.NET2.0的站点导航部分同意一个页面开辟者界说他们网站的可导航的布局。然后,这些数据就能够被各类Web控件所利用以便显现站点舆图、树状视图或菜单-它们可以高亮站点的导航而且/大概显现用户的站点地位。除与导航相干的Web控件外,站点导航API还供应了一组办法用于完成与网站导航信息的交互。
默许地,站点的可导航信息必需以一个准确格局化的XML文件编码。这类数据存储体例是,默许站点导航被硬编码利用。但是,ASP.NET2.0的供应者模子可使你更简单地利用你本人的数据存储来完成站点导航。比方,在一个我以后开辟的工程中,利用的一个数据库包括站点中的页面信息和分歧的用户具有页面中甚么样的允许权。不是在一个XML文件中从头界说这些信息而且必需勉力坚持两份信息的实时更新;而是,经由过程使用ASP.NET2.0中的站点导航功效,我能够复杂地创立一个供应者类,它可以间接与数据库信息事情。一旦创立这个类而且在网站的设置中指定,导航Web控件就能够依据存储在数据库中的使用程序的定制导航信息举行事情。(注重:在本文成文之时,这个工程利用的仍旧是ASP.NET1.x;但是,这个例子却有但愿可以向你展现供应者模子的长处。)
作为团体,我想,供应者模子只是ASP.NET2.0供应的最优异的迁徙特性之一。ASP.NET2.0供应了良多开辟者在1.x版本中必需定制的新特性。假如这些2.0版本的新特性利用过于"生硬"的完成体例,那末它将制止基于定制计划的正在利用中的1.x使用程序向它的迁徙,由于很多新的ASP.NET2.0Web控件都利用了这些新的子体系。但是,有了供应者模子后,我们就能够把我们的1.x使用程序晋级到2.0版本而且创立一个供应者以便使2.0版本的新的子体系与我们的定制计划集成到一同。这意味着,当迁徙到2.0版本时,我们可使用新的Web控件而且使它们经由过程供应者模子而天然地利用我们的现有体系。
5、增补信息
跟着供应者模子成为ASP.NET2.0中的一个主要构成部分,微软出书了良多关于这个主题的文章。假如你想懂得更多这方面的信息,那末我勉励你浏览一下RobHoward的两篇文章:
・《供应者模子计划形式与标准》;
・《ASP.NET1.x供应者模子》。
个中,第二篇文章剖析了怎样把供应者模子使用于你的ASP.NET1.x使用程序。另有两篇文章会商了ASP.NET2.0的站点导航子体系中的供应者用法:
・《了解和扩大ASP.NET2.0中的站点导航体系》,作者DavidGristwood;
・《定制ASP.NET2.0中的供应者》,作者MorganSkinner。
注重,微软还刊行了别的一个供应者开辟工具包,它也用于创立ASP.NET2.0供应者。并且,另有一篇不错的文章《ASP.NET2.0供应者模子》可供你参考。
6、结论
当创立具有各类请求的大批客户所利用的体系时,一种"生硬"的API完成大概会"吓坏"了开辟者;这类"生硬"的完成常常会强制客户批准且被锁定于体系架构师的"视野"以内。而一样平常地,公司常常更对可以与他们的现无方案协同事情的使用程序和框架感乐趣而不是强制他们的计划从命供给商供应的体系。
供应者模子供应了一种冲破这类"生硬"的完成成绩的办法。借助于供应者模子,体系就可以够天真地利用扩大特定基类的任何类。如许以来,客户能够创立他们本人的包含他们的定制逻辑和营业划定规矩的派生类。并且,这些新类能够无缝地插接到体系中,而不用搅扰使用程序中的现有代码或任何自创立以来的新的定制代码。
总之,供应者模子在ASP.NET2.0中失掉一般利用;并且这些观点也能够使用于ASP.NET1.x使用程序中。
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。 |
|