明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用Websharp Service Locator簡(jiǎn)化分布式系統(tǒng)開(kāi)發(fā)

[摘要]使用Websharp Service Locator簡(jiǎn)化分布式系統(tǒng)開(kāi)發(fā)什么是Websharp Service Locator對(duì)于多層的應(yīng)用系統(tǒng)來(lái)說(shuō),我們通常把它們劃分成客戶端、應(yīng)用服務(wù)層和數(shù)據(jù)庫(kù)。在...
使用Websharp Service Locator

簡(jiǎn)化分布式系統(tǒng)開(kāi)發(fā)

什么是Websharp Service Locator
對(duì)于多層的應(yīng)用系統(tǒng)來(lái)說(shuō),我們通常把它們劃分成客戶端、應(yīng)用服務(wù)層和數(shù)據(jù)庫(kù)。在應(yīng)用服務(wù)層,我們需要考慮至少兩個(gè)方面的問(wèn)題:

ü 如何實(shí)現(xiàn)業(yè)務(wù)邏輯

ü 如何向客戶端提供服務(wù)。

我們可能使用多種技術(shù)來(lái)實(shí)現(xiàn)服務(wù)的提供:Webservice、.Net Remoting、甚至EJB等。如此多的實(shí)現(xiàn)技術(shù),帶來(lái)的很大的靈活性,但同時(shí)也帶來(lái)了問(wèn)題,其中一個(gè)就是,有多少種服務(wù)端技術(shù),就得有多少種相應(yīng)的客戶端訪問(wèn)技術(shù)。甚至,在某些分布式應(yīng)用系統(tǒng)中,應(yīng)用邏輯使用不同的技術(shù)開(kāi)發(fā),存在于不同的機(jī)器上,有的存在于客戶機(jī)本機(jī),有的使用.Net Remoting開(kāi)發(fā),存在于局域網(wǎng)內(nèi),有的使用因特網(wǎng)上的Web Service,有的時(shí)候,我們希望相同的業(yè)務(wù)邏輯能夠支持不同的客戶端。

在這種情況下,我們需要一個(gè)一致的服務(wù)訪問(wèn)編程模型,以統(tǒng)合不同的服務(wù)訪問(wèn)模式,簡(jiǎn)化系統(tǒng)的開(kāi)發(fā)和部署。Websharp Service Locator(以下簡(jiǎn)稱WSL)提供了這樣一種能力,開(kāi)發(fā)人員只需要定義服務(wù)訪問(wèn)接口,就可以使用一致的方式透明的訪問(wèn)這些服務(wù),而不用理會(huì)這些服務(wù)之間的不同點(diǎn)。框架會(huì)自動(dòng)生成訪問(wèn)遠(yuǎn)程服務(wù)需要的代理。

Websharp是sourceforge上的一個(gè)新的開(kāi)源項(xiàng)目,目標(biāo)是提供一個(gè).Net環(huán)境下的輕量級(jí)的應(yīng)用系統(tǒng)框架,它包含了三個(gè)主要內(nèi)容:一個(gè)O/R Mapping框架,一個(gè)AOP框架,以及一個(gè)Service Locator。Service Locator目前還只完成本地程序集定位器、WebService定位器和.Net Remoting定位器的初步開(kāi)發(fā),但是,我們已經(jīng)可以使用它提供的框架功能來(lái)為我們的開(kāi)發(fā)提供助力。Websharp Service Locator下面的目標(biāo)是實(shí)現(xiàn)對(duì)J2EE的訪問(wèn)?梢詮 http://www.sourceforge.net/projects/websharp/ 下載所有源代碼。

Websharp Service Locator的主要接口
WSL是一個(gè)輕量級(jí)的框架,非常易于使用和擴(kuò)展。如果想使用WSL,那么只有一個(gè)類需要打交道:ServiceLocator,它的定義如下:

public abstract class ServiceLocator

{

public static object FindService(string serviceName,Type clientInterface)

}


如果你想用自己的定位器擴(kuò)展這個(gè)框架,那么,只有一個(gè)接口需要擴(kuò)展:IServiceLocator。這個(gè)接口非常簡(jiǎn)單,只有一個(gè)方法:

public interface IServiceLocator

{

object FindService(string serviceName,Type clientInterface);

}


Websharp Service Locator的配置文件
需要在三個(gè)地方配置WSL。

首先,在configSections節(jié)中,注冊(cè)WSL配置文件處理類的的相關(guān)信息,配置方法如下:

<configSections>

<section name="Websharp.Enterprise"

type="Websharp.Enterprise.EnterpriseConfigHandler,Websharp" />

configSections>


然后,在Websharp.Enterprise節(jié)中,注冊(cè)不同的服務(wù)定位器。如果你自己擴(kuò)展了這個(gè)框架,添加了新的服務(wù)定位器,也在這里注冊(cè)。其中,locator屬性的格式是:“類全名,Assembly名”。 服務(wù)定位器都是Singleton的。下面是目前WSL支持的服務(wù)定位器的注冊(cè)的信息:

<Websharp.Enterprise>

<ServiceTypes>

<ServiceType name="LocalAssembly"

locator="Websharp.Enterprise.LocalAssemblyLocator,Websharp" />

<ServiceType name="WebService"

locator="Websharp.Enterprise.WebServiceLocator,Websharp" />

<ServiceType name="DotNetRemoting"

locator="Websharp.Enterprise.DotNetRemotingLocator,Websharp" />

ServiceTypes>

Websharp.Enterprise>


最后,在Websharp.Enterprise下的Services節(jié)中,注冊(cè)每個(gè)服務(wù)。每個(gè)Service需要的屬性取決于不同的Locator的實(shí)現(xiàn),但是,name、service-type 和deploy-model是必須的。對(duì)于deploy-model,可以有兩種屬性值:Singleton和MultiInstance。

下面是一個(gè)例子:

<Websharp.Enterprise>

<ServiceTypes>

<ServiceType name="LocalAssembly"

locator="Websharp.Enterprise.LocalAssemblyLocator,Websharp" />

<ServiceType name="WebService"

locator="Websharp.Enterprise.WebServiceLocator,Websharp" />

<ServiceType name="DotNetRemoting"

locator="Websharp.Enterprise.DotNetRemotingLocator,Websharp" />

ServiceTypes>

<Services>

<Service name="HelloWorld" service-type="LocalAssembly" deploy-model="Singleton"

type="EnterpriseClient.HelloWorld,EnterpriseClient" />

<Service name="HelloWorldWebService" service-type="WebService"

deploy-model="Singleton"

url="http://localhost/webservicetest/hello.asmx"

namespace="http://www.websharp.org/webservices/" />

Services>

Websharp.Enterprise>


注:對(duì)于配置文件,在Web項(xiàng)目中,可以是web.config文件,對(duì)于Windows項(xiàng)目,可以自己為項(xiàng)目添加一個(gè)app.config配置文件。關(guān)于.net項(xiàng)目配置文件的更多內(nèi)容,請(qǐng)參考MSDN的相關(guān)文檔。

如何使用Websharp Service Locator?
使用WSL,一般的方法是這樣的:

1. 定義一個(gè)同你需要訪問(wèn)的服務(wù)一致的接口(當(dāng)然,如果你的服務(wù)是實(shí)現(xiàn)某個(gè)接口的,可以直接使用該接口)。接口的方法名和參數(shù)必須同服務(wù)類的方法名和參數(shù)一致。如果你的方法名和服務(wù)的方法名不一致,那么,可以使用ServiceMethodNameAttribute來(lái)指明服務(wù)的方法名。

2. 在配置文件按中注冊(cè)你需要訪問(wèn)的服務(wù)。

3. 調(diào)用ServiceLocator 的FindService方法.

4. 調(diào)用接口的方法。.

下面是一些例子,這些例子使用visual studio.net 2003開(kāi)發(fā),同樣可以從sourceforge下載。

LocalAssemblyLocator 的Hello World例子
按照以下步驟進(jìn)行:

1. 創(chuàng)建一個(gè)名為“EnterpriseClient”的windows console 項(xiàng)目,加入Websharp.dll的引用。

2. 添加一個(gè)類,名為“HelloWorld” ,然后添加一個(gè)名為“GetHello”的方法,代碼如下:

public class HelloWorld

{

public string GetHello(string hello)

{

return hello;

}

}


3. 添加一個(gè)名為 “IHelloWorld” 的接口,代碼如下:

public interface IHelloWorld

{

string GetHello(string hello);



[ServiceMethodName("GetHello")]

string GetHello2(string hello);

}


4. 填寫配置文件

xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section name="Websharp.Enterprise"

type="Websharp.Enterprise.EnterpriseConfigHandler,Websharp" />

configSections>



<Websharp.Enterprise>

<ServiceTypes>

<ServiceType name="LocalAssembly"

locator="Websharp.Enterprise.LocalAssemblyLocator,Websharp" />

<ServiceType name="WebService"

locator="Websharp.Enterprise.WebServiceLocator,Websharp" />

ServiceTypes>



<Services>

<Service name="HelloWorld" service-type="LocalAssembly"

deploy-model="Singleton"

type="EnterpriseClient.HelloWorld,EnterpriseClient" />

Services>

Websharp.Enterprise>

configuration>


5. 在Main方法中添加如下代碼:

public static void Main(string[] args)

{

IHelloWorld hello= ServiceLocator.FindService("HelloWorld",typeof(IHelloWorld)) as IHelloWorld;

Console.WriteLine(hello.GetHello("Hello World"));

Console.WriteLine(hello.GetHello2("Hello again"));

Console.ReadLine();

}


6. 運(yùn)行程序,就能夠得到下面的結(jié)果:



Hello World 的WebServiceLocator例子
按照以下步驟進(jìn)行:

1. 新建一個(gè)webservice 項(xiàng)目,名為“WebserviceTest”。

2. 新建一個(gè)webservice 類,名為“Hello” ,并添加一個(gè)“HelloWorld”方法,代碼如下:

[WebService(Namespace="http://www.websharp.org/webservices/")]

public class Hello : System.Web.Services.WebService

{

[WebMethod]

public string HelloWorld()

{

return "Hello World";

}

}


3. 使用上面我們創(chuàng)建的“EnterpriseClient”項(xiàng)目,添加一個(gè)接口“IHello” ,代碼如下:

public interface IHello

{

string HelloWorld();

}


4. 填寫配置文件

<Service name="HelloWorldWebService" service-type="WebService" deploy-model="Singleton"

url="http://localhost/webservicetest/hello.asmx"

namespace="http://www.websharp.org/webservices/" />


5. 在Main方法中添加下面的代碼:

public static void Main(string[] args)

{

IHello hello1= ServiceLocator.FindService

("HelloWorldWebService",typeof(IHello)) as IHello;

Console.WriteLine(hello1.HelloWorld());

Console.ReadLine();

}


6. 運(yùn)行程序,能夠得到下面的結(jié)果:




小結(jié)
使用WSL,我們可以使用一致的編程模型訪問(wèn)不同類型的服務(wù),從而簡(jiǎn)化軟件的開(kāi)發(fā)和部署。例如,我們可以在開(kāi)始的時(shí)候,使用本地Assembly的方式開(kāi)發(fā)軟件,然后,能夠很容易的改成使用Webservice來(lái)發(fā)布服務(wù),將軟件變成多層應(yīng)用。我們也可以使用WSL來(lái)讓相同的服務(wù)能夠支持不同的客戶端,而所有的客戶端都使用相同的編程模型。

Websharp是一個(gè)還處于開(kāi)發(fā)階段的框架,但是,因?yàn)樗情_(kāi)放源代碼的,我們可以直接使用他來(lái)進(jìn)行進(jìn)一步的開(kāi)發(fā)。目前WSL支持的服務(wù)還不是很多,實(shí)現(xiàn)也還比較簡(jiǎn)單,但是,他提供了一個(gè)很好的框架和構(gòu)建分布式應(yīng)用的方案,將來(lái),他將提供越來(lái)越多的功能。