提前發佈4/25上海俱樂部活動演講“集中化WCF服務配置管理”示例程序

承蒙4/25上海俱樂部活動組織團隊邀請,本人有幸將在本次活動中和大家分享一下“集中化WCF服務配置管理”方面的一些探索。爲了讓大家對活動當天我講的話題提前有一個更直觀的瞭解,在這裏提前介紹一下到時我會演示的示例程序。


本示例程序具體演示如下內容:

1) 基於SQL Server數據庫的集中化WCF服務配置管理;

2) 集中化ConnectingString管理;

3) 集中化AppVariable管理;

4) 基於集中化配置管理的WCF ServiceHostFactory和WCF ServiceLocator;

5) 基於集中化配置管理的跨WCF的LINQ Style分頁、排序查詢及DataSource控件的使用;

6) 整合本地ServiceLocator的WCF服務發佈和消費;


下載地址(請使用SVN客戶端下載):

http://nintegrate.googlecode.com/svn/trunk/


安裝說明:

請先使用SVN客戶端下載所有代碼,然後根據samples/setup目錄中的readme.txt初始化配置數據庫並打開示例的solution。要運行本示例,您需要至少安裝了IIS6,VS2008和SQL Server 2005或2008或Express。如果要運行Net.Tcp Binding的演示,需要IIS7。


示例工程:

本示例程序由下面四個C#工程項目組成:

1. SimpleServiceContracts - 定義了ServiceContracts和DataContracts

2. SimpleServiceImpls - 包含了ServiceContracts的實現類

3. SimpleServiceProvider – 服務發佈Web程序

4. SimpleServiceConsumer - 服務消費Web程序

這四個示例工程又分別依賴於由NIntegrate, NIntegrate.Query, NIntegrate.Query.Command和NIntegrate.Web這四個工程組成的名爲NIntegrate的基於WCF和集中化配置的SOA框架(關於這個框架的更多內容,Teddy的博客以後會有更多介紹,這裏讓我們還是先關注示例程序本身)。


SimpleServiceProvider程序

本程序使用IIS發佈了兩個WCF服務QueryService.svc和SimpleService.svc。這兩個.svc文件的內容如下:

QueryService.svc - NIntegrate查詢服務,由NIntegrate內置實現

1 <%@ ServiceHost Service="NIntegrate.Query.IQueryService, NIntegrate.Query, Version=0.5.0.1, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6" Factory="NIntegrate.WcfServiceHostFactory, NIntegrate, Version=0.5.0.1, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6" %>

 

SimpleService.svc - 一個簡單的SayHello服務,用於演示集中化配置的多Binding,多Endpoint的WCF服務發佈和消費

1 <%@ ServiceHost Service="SimpleServiceContracts.ISimpleServiceDemo, SimpleServiceContracts" Factory="NIntegrate.WcfServiceHostFactory, NIntegrate, Version=0.5.0.1, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6" %>

 

這裏值得注意的有兩點:

1. 這兩個服務的Service指定的是服務的ServiceContract接口類型而非服務的具體實現類。

2. 這兩個服務通過由NIntegrate實現的WcfServiceHostFactory自動通過指定的ServiceContract接口類型和基於SQL Server的集中化配置數據庫創建相應的ServiceHost,併發布服務。

 

解析:

WcfServiceHostFactory在內部是如何通過指定的ServiceContract接口類型找到具體的實現類的呢?是通過一個可在Web.config中配置的本地ServiceLocator實現的。NIntegrate內置實現了一個基於SQL Server數據庫集中化配置的AppVariableServiceLocator,並提供了方便的接口可以和第三方的ServiceLocator,如Unity,Castle這樣的IoC容器進行整合來自動定位接口的實現。在本示例中,ServiceContract接口類型對應的服務實現類,是通過數據庫中的AppVariable表進行映射,並使用AppVariableServiceLocator類進行定位的。

 

在SimpleServiceProvider的Web.config中,只需要設置一個AppCode和一個ConnectionString,無需任何WCF配置信息:

 1 
 2 <appSettings>
 3   <add key="NIntegrate.Configuration.AppCode" value="SP_SSP" />
 4   <!--To set service locator wrapper for external IoC container here, by default, the build-in AppVariableServiceLocator is used.-->
 5   <!--<add key="NIntegrate.ExternalServiceLocator" value="NIntegrate.AppVariableServiceLocator, NIntegrate, Version=0.5.0.1, Culture=neutral, PublicKeyToken=e2b9e2165dbdd5e6"/>-->
 6 </appSettings>
 7 <connectionStrings>
 8   <add name="NIntegrate.Configuration" connectionString="Data Source=vista;Initial Catalog=NIntegrateDemo;Persist Security Info=True;User ID=nbear;Password=nbear" providerName="System.Data.SqlClient" />
 9 </connectionStrings>
10 

 

SimpleServiceConsumer程序

本程序也是一個部署在IIS下的Web程序,它只包含一個Default.aspx頁面和一個Web.config文件。

他的Web.config和SimpleServiceProvider的Web.config一樣,只需要設置一個AppCode和一個ConnectringString:

1 
2 <appSettings>
3   <add key="NIntegrate.Configuration.AppCode" value="SP_SSC"/>
4 </appSettings>
5 <connectionStrings>
6   <add name="NIntegrate.Configuration" connectionString="Data Source=vista;Initial Catalog=NIntegrateDemo;Persist Security Info=True;User ID=nbear;Password=nbear"
7     providerName="System.Data.SqlClient"/>
8 </connectionStrings>
9 

 

他的Default.aspx頁面則演示了QueryService.svc和SimpleService.svc這兩個Service的使用。運行Default.aspx頁面的界面如下:

image

從界面可以看到,這裏有幾個GridView可以排序和編輯QueryService和SimpleService的Binding和Endpoint,他們都是通過使用由NIntegrate提供的QueryDataSource控件基於QueryService.svc實現的。最後一行是SimpleService.svc的調用的輸出和當前使用的WCF Binding類型。


當前,QueryService和SimpleService都使用數據庫中配置的“Sample - Shared Binding”這個Binding運行的,我們可以直接在GridView中修改Binding的類型和配置信息。修改Binding後,需要recycle IIS中的AppPool使新的配置生效。(注意,只有IIS7支持修改成非HTTP的Binding,並且要自己在IIS中啓用相應的net.tcp或net.pipe Binding支持)。


SimpleService有第二個名爲“SimpleServiceDemo Binding 2”的NetTcpBinding,如果您使用的是IIS7,並且已經啓用了IIS中的net.tcp Binding,可以點擊Enable將它激活。recycle IIS中的AppPool並重行運行 Default.aspx的話,您將看到,最後一行的Binding Type變成“NetTcpBinding”。也就是說,如果一個Service有多個激活狀態的不同類型的Endpoint,NIntegrate提供的ServiceManager會保證最優的Binding被使用。例如,這裏SimpleService有WSHttp和NetTcp這兩個Binding,當然NetTcp是最優的。更進一步。假如,這裏還配置了本地ServiceLocator,併爲SimpleService指定了對應的實現類,那麼,您也可以猜到,“更優”的本地Service實現會被使用,而不會走WCF通道。

 

QueryDataSource控件又是如何通過QueryService.svc實現對Service, Binding和Endpoint這些配置信息的呈現、排序和修改的呢?事實上,QueryService提供的查詢語法不僅支持簡單的CRUD,還支持LINQ Style的查詢語言,多種數據庫支持,數據庫特有的函數擴展和分頁排序,並且查詢語言可以跨WCF和COM兼容(也就是說,可以在非.NET應用程序如ASP中使用同樣的LINQ Style查詢語言訪問WCF發佈的服務遠程進行同樣的分頁排序查詢)。這裏容我賣個關子,就不多介紹了。大家可以選擇自己看代碼(包括NIntegrate核心類庫和本示例都是基於BSD協議公開全部源代碼的),來參加俱樂部活動和Teddy一起探討或者等Teddy的博客將來專門的專題來介紹。


好了就先介紹這麼多了。有任何意見和建議歡迎通過各種渠道和Teddy交流。如果您來參加4/25的活動,當然更歡迎了。不過,我知道很多朋友週末打算去看上海車展的,沒關係,頂頂這個帖子我也知足了。


//我是結尾符

Tag標籤: nintegrate soa
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章