上午整理了silverlight business application商業模闆的結構.這個模闆我在Silverlight 2.0版本以前是沒有見過. 微軟是從Silverlight 3.0版本中添加進來. 當時釋出正式版提出一個廣告語叫"See the light", 在SL一個論壇上找到以前這個廣告的宣傳配圖.
<a href="http://blog.51cto.com/attachment/201201/100733208.jpg" target="_blank"></a>
在以前微軟SL宣傳中使用另外一個"Silverlight up on your web"廣告語 這口氣 有點霸道吧. 做過MVC架構開發朋友應該都感覺到這和MVC顯示層架構 有點像.頁面比較幹淨. 出的樣式也比較接近. 但對這個模闆的結構 隻做了初步了解. 這方面資料也很少. 轉入正題Silverlight RIA Services Class Library類庫使用.
A:Silverlight RIA Services Class Library類庫
主要是可以建立可重複使用的中間層和表示層邏輯.但是它的建立比建立一個RIA Service 解決方案要麻煩一點. 當我們建立一個普通的Silverlight Application.如果啟用Enable WCF RIA Service.這個選項, 就是通過Silverlight Client同Server Project 建立一個 Ria Service Link關聯.而Silverlight RIA Services Class Library類庫 恰恰分離這種預設Ria Service Link關聯.把這種關系獨立出來.大緻如下下圖:
<a href="http://blog.51cto.com/attachment/201201/100738427.png" target="_blank"></a>
B:建立Silverlight RIA Services Class Library類庫
首先建立一個普通的Silverlight Application項目. 注意在建時 因為我們采用的Silverlight RIA Services Class Library來隔離RIa Service Link關系. 是以Enable WCF Ria Service 這個選項不選中即建立時不啟用Ria SErvice.
<a href="http://blog.51cto.com/attachment/201201/100745152.png" target="_blank"></a>
建立完成後再解決方案中添加Silverlight RIA Services Class Library類庫項目,完成解決方案項目結構:
<a href="http://blog.51cto.com/attachment/201201/100751212.png" target="_blank"></a>
在HROAServicelibDate檔案夾下多了兩個項目HROAServicelibDate和HROAServicelibDate.Web. 既然是通過類庫來建立Ris Service Link關聯就需要添加項目引用. 引用順序和規則:
<a href="http://blog.51cto.com/attachment/201201/100757500.png" target="_blank"></a>
從上圖就能看出Ria Service Link關聯關系建立, 在引用上可以看出是相對應的:
TestCreateServiceLib.Web引用類庫中HROAServicelibDate.Web.
TestCreateServiceLib引用類庫中HROAServiceDate.
Ria Service Link關聯關系建立完成 重寫生成解決方案. 當我們把這層關系獨立出來後.那麼原來的編碼習慣也随着改變. 以前把資料通路的Data Entity和Domain Service都存放在Server Client即TestCreateServiceLib.Web項目中. 現在則可以放在類庫中HROAServicelibDate.Web項目中.現在HROAServicelibDate.Web中添加一個WorkBill實體資料通路[一個實體和一個Domain Service].重寫編譯解決方案 來檢視所有檔案:
<a href="http://blog.51cto.com/attachment/201201/100803615.png" target="_blank"></a>
原來存放Generated_Code檔案夾由原來的預設方式TestCreateServiceLib項目中轉移到HROAServiceDate中.由此你應該能看出Generated_Code檔案夾轉移是随着Ria Service Link關系而同步變動.雖然沒有代碼是為TestCreateServiceLib項目産生,但在HROAServiceDate和TestCreateServiceLib項目之間建立引用關系.依然可以使用TestCreateServiceLib生成的代碼.
C:如上以類庫方式來通路資料:
先在TestCreateServiceLib添加 System.ServiceModel.DomainServices.Client 引用[預設是未添加的].預設在SDK目錄下: [Program Files]\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight下可以找到.
在MainPage.Xaml檔案拖入一個DataGrid控件來測試通路資料.布局如下:
<Grid x:Name="LayoutRoot" Background="Orange">
<sdk:DataGrid AutoGenerateColumns="False" Height="212" HorizontalAlignment="Left" Margin="51,78,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="522">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Code" Binding="{Binding Code}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="建立時間" Binding="{Binding CreateDate}"></sdk:DataGridTextColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
後端代碼:
//添加引用
using HROAServicelibDate.Web;//注意引用時Ria Service 類庫中Web項目 而非TestCreateServiceLib.Web
using System.ServiceModel.DomainServices.Client;
namespace TestCreateServiceLib
{
public partial class MainPage : UserControl
{
//聲明
private HROAServicelibDate.Web.HROAModelDomainContext getcontent = new HROAModelDomainContext();
public MainPage()
{
InitializeComponent();
//獲得資料并綁定
LoadOperation<HROAServicelibDate.Web.ProductOrder> getproductlist = this.getcontent.Load(this.getcontent.GetProductOrderQuery());
this.dataGrid1.ItemsSource = getproductlist.Entities;
}
}
}
這個如果重寫生成一下直接運作會提示一個GetProductOrderQuery()這個方法設計到對象GetProductORder Not Found找不到的異常:
<a href="http://blog.51cto.com/attachment/201201/100809585.png" target="_blank"></a>
這是因為通過承載Web運作Silverlight讀取Domain Service 資料庫連結資訊在TestCreateServiceLib.Web項目Web.Config中不存在. 所需要在HROAServicelibDate.Web項目App.Config檔案把實體對應和資料庫連結配置資訊拷貝到Web.Config中. 拷貝内容為.<connectionStrings>, <system.serviceModel>,和<httpModules>三個配置節點元素. 放到Web.Config.再次運作發現:
<a href="http://blog.51cto.com/attachment/201201/100816939.png" target="_blank"></a>
擷取資料成功.
本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/765070