-
皆様、こんにちは!WCF RIA Servicesのデモのご紹介が遅れており、まことに申し訳ありません。もうじきUpdateしますので、よろしくお願いします!
さて、表題のレポート、あげて戴きました。ちょっとぶち上げてしまいましたが?・・・(笑)、ぜひご覧ください。
http://www.designit.jp/archives/2009/12/report_k02.html
来週は、SaaS World対応等があり、これまた忙しい・・・。来場予定の方、ぜひよろしくお願いします。
鈴木 章太郎
-
皆様、おはようございます。昨日、一昨日の、PDC(http://microsoftpdc.com/)KeynoteのLive Smooth Streaming Powered by Silverlight/IIS7、ご覧戴いていますでしょうか?2日目の昨日は、Scott GuthrieによるSilverlight 4のBetaのReleaseのお知らせでした。個別な詳細は別途お送りするとして、まずは関連URLを下記にあげておきますので、まずはご覧ください。
Silverlight 4 Beta で開発されたアプリケーションを実行するためのランタイム
・ Silverlight 4 Beta 開発者ランタイム(Win)
・ Silverlight 4 Beta 開発者ランタイム(Mac)
・ Visual Studio 2010 Beta 2 用 Silverlight 4 Beta Tools 英語版
Silverlight 4 Beta アプリケーションを Visual Studio 2010 Beta 2 英語版上で開発するためのアドオンです。日本語版Toolsは、12月上旬の提供開始を予定しています。
・ Silverlight 4 Beta ソフトウェア開発キット 英語版
ソフトウェア開発キットには、ドキュメント、オンラインサンプル、ライブラリ、および Silverlight 4 Beta アプリケーションを開発するためのツールが含まれます。日本語版ソフトウェア開発キットは、12月上旬の提供開始を予定しています。
それと同時に、.NET RIA ServicesあらためWCF RIA Servicesも発表されています。Silverlight 3用がBeta、Silverlight 4/Dev10用がPreviewとなっています。こちらも別途Updateしますので、まずはインストールをしてみて戴ければと存じます。

鈴木 章太郎
-
皆様、こんにちは!CNETブログとマルチポストですがご容赦ください!
昨日のSteve Ballmer来日イベント、Microsoft Developer Forumはいかがでしたでしょうか?Silverlight + IIS Smooth Streamingで12月25日まで視聴可能ですので、ぜひこの機会にきわめて滑らかで高画質な動画でお楽しみください。http://www.microsoft.com/japan/powerpro/mdflive/default.mspx
※実はこの中でAzureのデモサイトとして、今夏、Tech・Ed2009でご紹介したWipse TVを再度ご紹介しました。
さて、その中でもご紹介させて戴きました、表題のセミナー、Windows Azure開発者向けになります。下記に詳細が記載されていますので、ぜひこの機会に参加戴ければ幸いです。http://www.microsoft.com/japan/msdn/vstudio/campaign/valueup/ http://www.microsoft.com/japan/msdn/vstudio/campaign/valueup/cloud.aspx
何卒よろしくお願いします。
鈴木 章太郎
-
皆様、こんにちは!続けてお知らせです。
Design IT! Conference 2009 というイベントが11月18日に開催されます。これにマイクロソフトも参加させていただくことになりました。私と、もう1名UXエバンジェリスト(素晴らしいデモを披露してくれる予定です)の合計2名で登壇予定です。
有償イベントでもあり、中身の濃いセッションをお届けできればと思っています。我々の前にも、Googleさんの初来日のUXデザイナーの方(やはり2名)が登壇されるようです。
ご来場を予定されている方、ご検討中の方、何卒よろしくお願いします。
鈴木 章太郎
-
皆様、こんにちは!ちょっと風邪をひいて体調を崩したりしてしまったため、更新が遅くなり誠に申し訳ありません。
多くの方に参加戴き、感謝しております。当日の資料は、事務局から参加された皆様にThank youメール等で届いているかと思いますので、私からは、IE8分のみ、下記に公開しておきますね。
http://cid-1c511c93217c3e4d.skydrive.live.com/browse.aspx/TFSeminar-1021
是非ダウンロードして戴き、お試しください。
また、Silverlight(Deep Zoom)/IE8 Web Slice/Windows Azure Strorageの組み合わせとしてご紹介した、ニュージーランドのMSN “ Fashion Week “のサイトとインストール先、そして、ソースコードを下記に紹介します。
・Webサイト(Webスライスのインストール元)
http://kiwi.blob.core.windows.net/imagesdz/Default.htm
・ソースコード
http://blogs.msdn.com/nigel/archive/2009/09/24/msn-air-new-zealand-fashion-week.aspx
こちらもセッション後半でご紹介したものです。是非興味があればご覧ください。ただし著作権の関係で、Deep Zoomに使われているモデルの画像等は含まれてありませんので、その点はぜひご了承ください。
何卒宜しくお願いします(^^)!
-
皆様、こんにちは!
本日は、今月21日のTechFieldersセミナーの内容を少しだけご紹介します。
IE8の主な新機能(検索候補の表示、アクセラレータ、Webスライス)は、皆様既に使いこなされていることでしょう。特に、価格COM様をはじめ、日本を代表するISP様等にも多くご採用戴いていることもあり、既にその有用性や便利さにはお気づきの方も多いかと思います。
この実装については、実はそれほど難しくはなく、また実に他のテクノロジーとの連携もしやすくなっています。応用編としては、Silverlight3やWindows Azureのストレージとの連携も可能です。
このセミナーでは、この新しいIE8の3機能の概要や仕組みを解説させて戴いたうえで、それぞれの機能ごとに、実装方法を解説していきます。Silverlightとの連携もお見せできると思いますので、もしご興味おありの方は、是非いらしてください。
またWindows 7の新機能のセッションの方は、こちらは時間の関係もあり(私の担当は30分)、対象とする機能を絞って、基本的な機能概要と書き方をマネージドコードでご紹介していくことにしたいと思います。こちらも是非ご期待くださいませ。
何卒よろしくお願いします(^^)!
鈴木 章太郎
-
皆様、こんにちは!連休、いかがお過ごしでしょうか?
※私は引っ越しがこの連休中にありますので、そちらの準備に忙殺されています・・・。
さて、セミナーでは多くの方に参加戴き誠に感謝しております。お約束したWindows Azureの登録~Deployの手順等を纏めたドキュメントと、テスト用にUploadして戴くアプリケーション(HelloWorld)を下記に公開しました。
http://cid-1c511c93217c3e4d.skydrive.live.com/browse.aspx/TFSeminar0918-WindowsAzurePlatform
是非こちらを使って、未だ試していない方は、是非Azureをご体験ください。
また、当日使用した資料のPDFも入れておきました。ご紹介したデモは4つありましたが、そのうち3つは、ご説明した通りWindows Azure Platform Training Kitのをベースにしています。
・Windows Azureサービスの構築
・Windows Azure テーブルの利用
・.NET サービス バスの紹介 - 基本的なクライアントとサービスの作成 –
上記に関しては、コミュニティの方々の手により、日本語化されたものが用意されていますので、是非こちらを参照しながら、やってみてください。
http://windows-azure.jp/community/TrainingKit.aspx
今後とも何卒よろしくお願いします!
なお、4番目にご紹介したデモを含め、.NET RIA Services関係の続編は、この後投稿します。WCF連携、Astoria連携、だけでなく、書きたいTopicが沢山あるのですが、大変遅くなりすみません。もう少しお待ちください。
鈴木 章太郎
-
皆様、こんにちは!
Tech・Edのデモに関しましては、これからフォローアップを書いていきますが、まずその前提として、最後にご紹介したデモを、Azureにデプロイしましたので、ご参照ください。
(※ただし、Export To Excelボタンがうまく動いていないので、再度、新しいものをUpload予定です)
http://riaarchitect.cloudapp.net/
SQL Azureにデータが50件程度しか入っていませんが、ご参考までにご覧ください。データはまた後で追加します。
以前のデモ作成手順でご紹介した通り、Origin(種別)のBoxに頭文字(AとかHとか)を入れ、候補のいずれかをクリックして選択すると、Auto Complete Boxでインクリメンタルに検索され結果が表示されます。またActivity Controlにより、検索中にData Gridを含むStack Panel左側全体にアニメーションが表示されます。
アーキテクチャ的には、セッションでもご紹介しました通り、
・Web Role = .NET RIA ServicesソリューションのWebアプリケーション(サーバー側)のビジネスロジック(Full Trust)
・DAL = LINQ to SQL
・DB = SQL Azure
に分けてあります。
次回からは、Astoria経由のWindows Formsからの利用、WCFベース・Astoriaベースのデータソース利用と、このAzureの利用、等を、順次、解説していきます。
鈴木 章太郎
-
皆様、こんばんは!
すみません、Microsoft Online Servicesの方にログオンできず、そちらには未だUploadができていないのですが、SkydriveにはUploadしました。Microsoft Online ServicesにはあとでUploadしておきます。
http://cid-1c511c93217c3e4d.skydrive.live.com/browse.aspx/TechEd2009T2-403DemoFiles
いずれにしても、REMIX09 とは異なり、有償セッションのビデオ(Microsoft Online Services内に配置予定です)を見れるのはTech・Ed参加者だけですので、特に支障はないかと思います。(U.Sでも、その他の国でも、この点は同じです)
さっそくこれらをダウンロードしてお使いください。
なお、Azureのプロジェクトに関しては、http://azure.com からAzureのインビテーションコードを取得した上で、 Azure July CTP版のTools/SDKをインストールしてください。それと、実行するときは、管理者権限で開くことを忘れずに!
またSQL Azureについては、同様にインビテーションコードを取得してください。Azureとは別物です。接続するには、私のDemoと同じように、まずSQL Server Management Studioで、SQL AzureのサイトでDatabaseを作った際に生成されるConnectionStringをコピーして、接続文字列を作成して接続してみてください。そのうえで、Create TableしたりデータをInsertしたりする必要がありますが、このあたりは皆様ご存知と言いますか、SQL Serverと同じやり方で可能です。
なお、WCF連携(およびAstoria連携)、Azure連携等で若干の解説を加える予定でいますし、RIA Services全体について、今後もたくさんのシナリオを解説していく予定でいますので、このシリーズにご期待くださいませ。
宜しくお願いします(^^)!
P.S.
ZDNet Builder Blogでも下記の書籍の発売をお知らせしました。是非皆様ご覧ください。
鈴木 章太郎
-
皆様、こんにちは。昨日はT2-403、朝一のセッションにもかかわらず、私のセッションにご参加戴き誠に有難うございました。T6-201の方も大盛況で、また多くの方から高い評価を戴き感謝しております。
遅くなり申し訳ありません!この後、お約束通り、Online ServicesとSkyDriveにデモファイルを後ほどUploadしますので、しばらくお待ちください。Upload予定なのは、下記の(※は同一プロジェクトです)。Tech・Edの場合には、通常のイベント異なり、有償の3日間のイベントですので、参加者様向けにOnline Servicesでも公開させて戴く必要があるためです。
・Hello! RIA Services – Business Application Template,DomainService と DomainContext
・Silverlight 3クライアントを利用したリッチなデータクエリーの実現-1
・Silverlight 3クライアントを利用したリッチなデータクエリーの実現-2 ※
・ASP.NET との連携による Client View の拡張 ※
・Windows FormsからのADO.NET Dataservices経由での利用 ※
・WCF ベースのデータソース利用
本番で落ちてしまい大変失礼しました。ちゃんと動きますので、お試しください。
・Windows Azure, SQL Azure Databaseとの連携
最後のAzureとの連携(応用編)ですが、こちらのセミナーでも、このデモの更なる拡張も含め、ご紹介できればと思っています。
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032423184&Culture=ja-JP
それでは、しばらくお待ちください(^^)!
鈴木 章太郎
-
皆様、こんばんは!
長らく更新ができず申し訳ありませんでした。さて、本日は、私の担当する2セッションのうちの1つ、表題のセッションにつき、お知らせしたいと思います。
このセッションは、既に、オンラインサービスでご覧になったり、セッションアブストをご覧になっている方が多いかもしれませんが、なかなかどうして、かなり面白いセッションになりそうです(自分で言うのもなんですが・・・)。
タイトルは、「マイクロソフトの最新/次世代技術と現在/未来のビジネスへの適用可能性」というものです。
Silverlight 3や、Windows 7、それからWindows Azure/.NET Services等色々な技術が実は登場しますが、全くタイトルにはそれが入っていません。
実は、これにはトラックオーナーである同僚のエバンジェリスト長沢の意向が反映されているのです。詳しくは彼のブログのエントリを見て戴きたいのですが、今回のこのセッションは、技術的な内容の個別の各論の深掘りではなく、大企業や官公庁でソリューションの企画に携わる方や、調達部門の方々、IT部門の方々、等、様々な立場の方々に、最新の技術や、現在は未だベータやCTPの技術を使って、どんなことがビジネスシナリオとして実現可能なのか、ということを、お伝えするのが趣旨となります。トラック6は全てこの思想で貫かれています。
すなわち、このセッションは、最新の企業・官公庁事例や、最新の技術を駆使した事例を、技術解説やコンセプトとともに、皆様にご紹介するのが趣旨です。
まあ、トラック6のコンセプトそのままのタイトルをつけたのが、私のセッションということになりますね(^^)!?
従いまして、開発者の方やIT部門の方のみならず、調達担当者や意思決定権を持つ方々にとっても、非常に有益なセッションではないかと思います。
個別の技術に関しては、他のセッションでカバーされていますので、是非そちらをご覧戴ければと存じます。まずは、このセッションにご来場戴き、その後のセッション選択の一助にして戴ければと思います。
初日の午後1番目、もう一つのKeynoteくらいの意気込みで(笑)、私も頑張る予定でいます。
是非ご来場ください。お待ちしております。
鈴木 章太郎
-
今までご紹介したのは、データの更新とバリデーションの追加でしたが、データの新規追加はどのようにすればいいでしょうか?これを行うために、Silverlight 3 に新しく追加されたテンプレートである、ChildWindowを見てみましょう。
クライアントプロジェクト側にあるViewsフォルダを右クリックして、追加→新規アイテムの追加→Child WindowでAddNewWindow.xamlを追加します。 まずはこのデフォルトのウィンドウを表示しましょう。
最初に、メインフォームにボタンを追加して、今作成したChildwindowを、表示します。
<Home.xaml>
<Button Content="Add New"
Width="105" Height="28"
Margin="5,0,0,0" HorizontalAlignment="Left"
Click="AddNew_Click" ></Button>
次に、新規作成ボタンのイベントハンドラを追加します。
<Home.xaml>
private void AddNew_Click(object sender, RoutedEventArgs e)
{
var w = new AddNewWindow();
w.Show();
}
ここで重要なのは、すでにこのChildWindowのテンプレートには、OKとCancel ボタン、それにClose Boxが含まれており、それらはすでに動くようになっていることです。
次いで、AddNewWindow.xamlのGridの下に、DataFormを追加します。これは、今まで更新までのステップでご紹介したのと同じモデルを使いたいためです。当該DataForm により、今まで見てきた更新と同じ特徴を利用することができます。
<AddNewWindow.xaml>
<dataControls:DataForm x:Name="newEmployeeForm" Height="393" Width="331"
VerticalAlignment="Top"
CommandButtonsVisibility="None"
Header="Add New Super Employee"
HorizontalAlignment="Left" >
<dataControls:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataControls:DataField>
<TextBox Text="{Binding Name, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding EmployeeID, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Origin, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Sites, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Gender, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Publishers, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<controls:DatePicker Text="{Binding LastEdit, Mode=OneWay}"> </controls:DatePicker>
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Issues, Mode=TwoWay}" />
</dataControls:DataField>
</StackPanel>
</DataTemplate>
</dataControls:DataForm.EditTemplate>
</dataControls:DataForm>
ここで、ChildWindowのコードビハインドに移動して、クラスレベルのフィールドに下記を追加する必要があります。 public partial class AddNewWindow : ChildWindowの直下になります。
<AddNewWindow.xaml.cs>
public SuperEmployee NewEmployee { get; set; }
次に、コンストラクタ内でインスタンスを初期化します。
NewEmployee = new SuperEmployee();
NewEmployee.LastEdit = DateTime.Now.Date;
this.newEmployeeForm.CurrentItem = NewEmployee;
そして、OK ボタンのイベントハンドラを追加します。
private void OKButton_Click(object sender, RoutedEventArgs e)
{
newEmployeeForm.CommitEdit();
this.DialogResult = true;
}
次いで、Cancelボタンのイベントハンドラを追加します。
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
これで完了です。次に、この更新をまずはローカルでコミットし、そのうえでサーバーに送信します。
void addNewWindow_Closed(object sender, EventArgs e)
{
var win = sender as AddNewWindow;
var context = dds.DomainContext as SuperEmployeeDomainContext;
if (win.DialogResult == true)
{
context.SuperEmployees.Add(win.NewEmployee);
}
}
これにより、当該Submit ボタンは、このローカルでコミットされた更新を、サーバーに送信します。
以上で、新規追加までのステップのデモ解説は終了です。後は、皆様の方で、チュートリアルや、MSDNのドキュメント等、PPTファイルにリファレンスを入れたものを読んでいただければと思います。
ADO.NET Data Services、WCFとの連携、そしてクラウドデータベースとの連携等も含め、このサンプルの拡張に関しては、Tech・Ed Japan 2009 でご紹介できればと思っています。
参加される方は、ぜひお楽しみに!まだ参加するかどうかご検討中の方は、是非ご参加ください。
よろしくお願いします。
-
今までのは確かにいくつかのリッチなデータ表示の仕方でした。しかし次に、ビジネスアプリケーションは、データの更新もうまく行わなければなりません。そのやり方を学びましょう。
最初に、すべてのXAMLを下記のものに置き換えます。これはマスター・ディテールのビューとなっています。
<Home.xaml(LayoutRoot以下を表示)>
<Grid x:Name="LayoutRoot">
<ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource PageScrollViewerStyle}" >
<StackPanel x:Name="ContentStackPanel" Style="{StaticResource ContentStackPanelStyle}">
<TextBlock x:Name="HeaderText" Style="{StaticResource HeaderTextStyle}"
Text="Home"/>
<TextBlock x:Name="ContentText" Style="{StaticResource ContentTextStyle}"
Text="特別従業員派遣要員名簿"/>
<!--DomainDataSource-->
<riaControls:DomainDataSource x:Name="dds"
AutoLoad="True"
QueryName="GetSuperEmployeesQuery"
LoadSize="20">
<!--DomainDataSource.DomainContext-->
<riaControls:DomainDataSource.DomainContext>
<App:SuperEmployeeDomainContext/>
</riaControls:DomainDataSource.DomainContext>
<!--GroupDescriptors-->
<riaControls:DomainDataSource.GroupDescriptors>
<datagroup:GroupDescriptor PropertyPath="Publishers" />
</riaControls:DomainDataSource.GroupDescriptors>
<!--FilterDescriptors-->
<riaControls:DomainDataSource.FilterDescriptors>
<datagroup:FilterDescriptorCollection>
<datagroup:FilterDescriptor PropertyPath="Origin"
Operator="StartsWith">
<datagroup:ControlParameter PropertyName="Text"
RefreshEventName="TextChanged"
ControlName="originFilterBox">
</datagroup:ControlParameter>
</datagroup:FilterDescriptor>
</datagroup:FilterDescriptorCollection>
</riaControls:DomainDataSource.FilterDescriptors>
</riaControls:DomainDataSource>
<StackPanel Style="{StaticResource DetailsStackPanelStyle}">
<activity:Activity IsActive="{Binding IsBusy, ElementName=dds}">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="Origin: " />
<input:AutoCompleteBox x:Name="originFilterBox" Width="338" Height="30"
ValueMemberBinding="{Binding Name}"
ItemTemplate="{StaticResource OriginsDataTemplate}" />
</StackPanel>
<data:DataGrid x:Name="dataGrid1" Height="380" Width="380"
IsReadOnly="True" AutoGenerateColumns="False"
HorizontalAlignment="Left"
SelectionChanged="dataGrid1_SelectionChanged"
HorizontalScrollBarVisibility="Disabled"
ItemsSource="{Binding Data, ElementName=dds}"
>
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<data:DataGridTextColumn Header="Employee ID" Binding="{Binding EmployeeID}" />
<data:DataGridTextColumn Header="Origin" Binding="{Binding Origin}" />
</data:DataGrid.Columns>
</data:DataGrid>
<data:DataPager PageSize="13" Width="379"
HorizontalAlignment="Left"
Source="{Binding Data, ElementName=dds}"
Margin="0,0.2,0,0" />
<!--Submit Button-->
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
<Button Content="Submit" Width="105" Height="28"
Click="SubmitButton_Click" />
<!--Add New Button ☆ -->
</StackPanel>
</StackPanel>
</activity:Activity>
<StackPanel Margin="35,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="498" >
<dataControls:DataForm x:Name="dataForm1" Height="393" Width="331"
VerticalAlignment="Top"
Header="Product Details"
CurrentItem="{Binding SelectedItem, ElementName=dataGrid1}"
HorizontalAlignment="Left" >
<dataControls:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataControls:DataField>
<TextBox Text="{Binding Name, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding EmployeeID, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Origin, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Sites, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Gender, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Publishers, Mode=TwoWay}" />
</dataControls:DataField>
<dataControls:DataField>
<controls:DatePicker Text="{Binding LastEdit, Mode=OneWay}"></controls:DatePicker>
</dataControls:DataField>
<dataControls:DataField>
<TextBox Text="{Binding Issues, Mode=TwoWay}" />
</dataControls:DataField>
</StackPanel>
</DataTemplate>
</dataControls:DataForm.EditTemplate>
</dataControls:DataForm>
<!--Permalink -->
<TextBlock Text="PermaLink:"></TextBlock>
<TextBox x:Name="PermalinkTextBox" Width="400" Height="25" TextWrapping="NoWrap" Foreground="#FFB4B4B4" />
</StackPanel>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
途中の☆の個所までは、これまで作ってきたものに似ています。 しかしその次の行以降は、DataForm コントロールを追加し、特定のエンティティに対して大変見やすく編集しやすいものになっています。
F5を押して実行します。まさにこれにより、伝統的なマスター・ディテールのシナリオが実現できます。
ここで注目すべきは、アイテムを更新すると”Dirty”としてマークされます(※)。
これが意味しているのは、それらの更新データは、再度サーバーに送信される必要があるということです。多くのアイテムを編集できますが、編集を元に戻すと、”Dirty"フラグ(※)は消えます。 それでは、Submit ボタンのイベントハンドラを実装しましょう。
<SubmitButton_Click>
private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
dataForm1.CommitEdit();
dds.SubmitChanges();
}
最初に、現在編集中のアイテムをコミットする必要があります。その後、更新を送信します。これにより、差分が更新されてサーバーに返送され、更新メソッドが呼ばれます。”Dirty"マークが消えたのを確認してください。
データ更新におけるバリデーション
確かにかなり格好良くなりました。しかし、データバリデーションはどうなのでしょう? 実はこの点も“最初から”Type Level のバリデーションは作成されています(当該フィールドがもしIntとタイプ定義されていると、String型のデータを入れるとエラーになります)。それでは、もう少し追加ができないか見てみましょう。
これを行うには、サーバー側にある、SuperEmployeeDomainService.metadata.csを編集する必要があります。 サーバー側でこれらのバリデーションを行うことは極めて重要です。それにより当該システムにおいて、すべてのバリデーションが、いったん素晴らしいUX で実行され、次いでサーバー側で実行されることにより、データの信頼性が保障されるのです。 更新メソッドがDomainService上で呼ばれるまでに、すべてのバリデーションがなされている必要があります。
下記に、いくつかの追加可能なバリデーションを列挙します。
<SuperEmployeeDomainService.metadata.cs>
・・・
[ReadOnly(true)]
public int EmployeeID;
public EntityState EntityState;
[RegularExpression("^(?:m|M|male|Male|f|F|female|Female)$",
ErrorMessage = "性別は 'Male' か 'Female'である必要があります。")]
public string Gender;
[Range(0, 10000,
ErrorMessage = "Issuesは0 から1000の間で入力してください。")]
public Nullable<int> Issues;
public Nullable<DateTime> LastEdit;
[Required]
[StringLength(100)]
public string Name;
追加したら、リビルドして、アプリケーションを実行すると、素晴らしいバリデーションがUIとMidティアに追加されています。
いかがでしょうか?今回のものは、データの更新とバリデーションの追加でしたが、それではデータの新規追加はどのようにすればいいでしょうか?次回は、この目的を中心に、Silverlight 3 に新しく追加されたテンプレートである、ChildWindowを見てみましょう。
-
ページング、ソーティング、フィルタリング、オートコンプリートボックス
前回のクエリでは、すべてのエントリが返されましたが、Webアプリケーションの世界では、ページングやサーバーサイドのソーティング、そしてフィルタリングなどを行いたいと考えるのが、当たり前ですよね?.NET RIA Servicesと、Silverlight 3から登場した新しいコントロールを組み合わせると、簡単にそれを行うことができるのです。どのようにしたら可能か見ていきましょう。
最初に、前回追加したコードビハインドをすべて削除します。
<Home.xaml.cs>
public Home()
{
InitializeComponent();
}
そして、それらに代わって、Home.xamlの中に、DomainDataSourceというものを追加しましょう。詳しくは.NET RIA ServicesのPreviewの文書を読んで戴ければと思いますが、REMIXのセッションでもご説明した通り、SilverlightのXAMLのコントロールで、DomainServiceにマッピングできるものだと考えておいて戴ければOKです。これも、Toolboxからドラッグ&ドロップできます。そして、下記のように編集してみてください。
<Home.xaml (TextBlockの後)>
<riaControls:DomainDataSource x:Name="dds"
AutoLoad="True"
QueryName="GetSuperEmployeesQuery"
LoadSize="20">
<riaControls:DomainDataSource.DomainContext>
<App:SuperEmployeeDomainContext/>
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
3行目では、GetSuperEmployeesQuery メソッドをDomainContextから取得しています。これは6行目に特定されています。 4行目で注目すべきは、LoadSize を20に設定しているところです。これは、ダウンロードするデータを一度に20件にしたいということです。.NET RIA Servicesのように非同期処理でありながら同期処理に近いソリューションを作成するときは、パフォーマンス上も極めて重要な制御になってきます。
それでは、これを当該DataGridにバインドし、アクティビティコントロールを使って、プログレスインジケータつきにして見ましょう。
<Home.xaml>
<activity:Activity IsActive="{Binding IsBusy, ElementName=dds}"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="900" Margin="10,5,10,0">
<StackPanel>
<data:DataGrid x:Name="dataGrid1" Height="300" Width="900"
ItemsSource="{Binding Data, ElementName=dds}">
</data:DataGrid>
<data:DataPager PageSize="10" Width="900"
HorizontalAlignment="Left"
Source="{Binding Data, ElementName=dds}"
Margin="0,0.2,0,0" />
</StackPanel>
</activity:Activity>
6行目に、データグリッドがあります。これは当該dds.Data プロパティにバインドされています (7行目)。そして、9行目で、DataPager を追加しています。これは、同じデータソースにバインドされています。これにより、Paging UIが実現できます。注意すべきは9行目、表示するレコードを一度に10件にしています。最終的に、すべての内容を一つのActivityControlに入れて、進行状況を表示します。
ActivityControl、DataGrid、そしてDataPagerの素晴らしい点は、どれも多くのデータ、たとえばWCFサービスから取得したデータ、RESTサービスから取得したデータ、と一緒に使えるという点です。それでは、 F5を押して実行してみましょう。
注目すべきは、20件のレコードを一度にロードしていますが、表示しているのは10件だけという点です。すなわち、1ページ進むのはクライアント側だけの処理ですが、さらに1ページ進もうとすると、サーバー側に問い合わせてデータを取得し次の20件をロードするわけです。これはソーティングでもすべて同様に動きます。 もう一つ素晴らしい点は、これらすべての処理を行うのに、サーバー側・クライアント側のいずれにもコードを追加していません。これは、まさにLINQのもたらすマジックです。
・グルーピング
次に、グルーピングを追加します。出版社でグルーピングするようにPublishersを設定します。
<Home.xaml>
<riaControls:DomainDataSource.GroupDescriptors>
<datagroup:GroupDescriptor PropertyPath="Publishers" />
</riaControls:DomainDataSource.GroupDescriptors>
・フィルタリング
それでは、フィルタリングも追加してみましょう。最初に、ラベルとテキストボックスを追加します。
<Home.xaml >
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="Origin: "></TextBlock>
<TextBox x:Name="originFilterBox" Width="75" Height="20"></TextBox>
</StackPanel>
そして次に、これらのフィルターボックスをDomainDataSourceに追加します。
<Home.xaml >
<riaControls:DomainDataSource.FilterDescriptors>
<datagroup:FilterDescriptorCollection>
<datagroup:FilterDescriptor PropertyPath="Origin"
Operator="StartsWith">
<datagroup:ControlParameter PropertyName="Text"
RefreshEventName="TextChanged"
ControlName="originFilterBox">
</datagroup:ControlParameter>
</datagroup:FilterDescriptor>
</datagroup:FilterDescriptorCollection>
</riaControls:DomainDataSource.FilterDescriptors>
F5を押して実行すると、フィルターボックスが追加されています。そして、何かをその中にタイプすると、サーバー側で結果のフィルタリングが行われます。 ここでは“Animal”と打ってみました。
・オートコンプリートボックスによるフィルタリング
さて、このような場合には、シンプルなテキストボックスよりは、オートコンプリートボックスが欲しくなります。追加しましょう。ここで最初にやらなければならないのは、すべてのオプションを取得することです。注意すべきは、それらのオプションは、すべてサーバー側から取得する必要があることです (クライアントは、すべてのオプションを知らないかもしれません。ページング等を行っているためです)。これを行うためには、サーバー側のDomainServiceにメソッドを追加します。
<SuperEmployeeDomainService.cs>
public class Origin
{
public Origin() { }
[Key]
public string Name { get; set; }
public int Count { get; set; }
}
そして、このメソッドはOriginsを取得して返します。
<SuperEmployeeDomainService.cs >
public IQueryable<Origin> GetOrigins()
{
var q = (from emp in Context.SuperEmployeeSet
select emp.Origin).Distinct()
.Select(name => new Origin
{
Name = name,
Count = Context.SuperEmployeeSet.Count
(emp => emp.Origin.Trim() == name.Trim())
});
q = q.Where(emp => emp.Name != null);
return q;
}
そして、Silverlight 3 SDKにある、オートコンプリートコントロールを追加する必要があります。先程追加したテキストボックスを削除して下記のように入力します。
<Home.xaml >
<input:AutoCompleteBox
x:Name="originFilterBox"
Width="75" Height="30"
ValueMemberBinding="{Binding Name}"
ItemTemplate="{StaticResource OriginsDataTemplate}" >
</input:AutoCompleteBox>
さらに、これをロードするために、コードビハインドに若干の追加が必要になります。
<Home.xaml.cs>
public Home()
{
InitializeComponent();
var context = dds.DomainContext as SuperEmployeeDomainContext;
originFilterBox.ItemsSource = context.Origins;
context.Load(context.GetOriginsQuery());
}
F5を押して実行すると、結果は下記の通りです。
ここまでいかがでしょうか?かなりいろいろなことができることがおわかりいただけたかと思います。次は、Mater / DetailへのXAMLの変更とバリデーションの追加を説明します。
-
皆様、こんにちは!更新が遅くなりがちで申し訳ありません。早速続きにまいりましょう。
次のデモは、Rich Data Queryの追加です。これがこのRIA Servicesの最大のハイライトとなります。ほとんどのビジネスアプリはデータを扱います。そこで、 どのように.NET RIA Servicesがデータを取り扱うかを見ていきましょう。このWebのプロジェクトに追加していきます。
Entity Framework データモデルを使いますが、.NET RIA Servicesは、どのようなタイプのデータとも連携が可能です。たとえば、plain old CLR objects(POCO)といわれるものから、xml のファイルや、XML Web サービス、そしてLinq to Sqlまでいろいろです。最初に、Entity Framework modelをデータとして取り扱います。
このデモでは、わかりやすくするため、すごく単純なデータを扱います。単一のEmployeeテーブルをモデルとして使い、特別任務従業員(映画やアニメーションに出てくるキャラクターでNorthwindに入っているテーブル)をここから派遣するというシナリオです。
さて、Silverlightクライアントからどのようにデータにアクセスしたらよいでしょうか? もちろん、伝統的には多くのビジネスアプリケーションは、2階層のアプリケーションとしてスタートしました。しかし、これはスケーラビリティとフレキシビリティの点で、多くの問題を含んでいることは皆さんご存じのとおりです。さらに… もっといえば、このモデルは、Silverlight/Web クライアントアーキテクチャでは動きません。
そこで、開発者は、多階層のアプリケーションモデルを実装することになります。.NET RIA Services は、この多階層アプリケーションの開発を、より簡単にし、スケーラブルで、フレキシブルな、多階層サービスを作成することができ、そのサービスは、WCFやADO.NET Data Servicesと一緒に稼働可能です(もっと後で稿を改めて述べます)。
この.NET RIA Services が定義するのは、UI層のアプリケーションロジックであり、様々なデータソースに対するアクセスをカプセル化します。このデータソースには、伝統的なRDB、POCO (plain old CLR objects) から、クラウドサービス、たとえばAzure, アマゾンS3, 等(REST経由)が含まれます。これの素晴らしい点の一つは、オンプレミスのSQLサーバーのデータソースから、Azureのストレージサービスに切り替えるのに、UIロジックを全く変更する必要がないところです。
・最初のアプリケーション作成
それでは、いかに簡単に、この .NET RIA Servicesのアプリケーションを作成できるか見てみましょう。サーバープロジェクト側(/MyApp.Web)を右クリックして、追加→新規アイテム→Domain Service classを選びます。
Wizardの中で、データソースを選択します。ここではLinq2Sqlクラスを選んでいますが、POCO クラス等々ももちろん適用できます。
SuperEmployeeDomainService.cs クラスの中で、データアクセスに関するすべての操作―GetSuperEmployees(検索)、InsertSuperEmployee(新規作成)、UpdateSuperEmployee(更新)、DeleteSuperEmployee(削除) ―の各スタブが作成されます。
もちろん、このクラスの中を編集してこれらをカスタマイズすることもできます。今からしばらくの間、GetSuperEmployees()を使用しますので、少しカスタマイズしておきましょう。
GetSuperEmployees()の編集
public IQueryable<SuperEmployee> GetSuperEmployees()
{
return this.Context.SuperEmployeeSet
.Where(emp=>emp.Issues>100)
.OrderBy(emp=>emp.EmployeeID);
}
クライアント側(/MyApp)の処理
次に、クライアント側(/MyApp)に移りましょう。その前に、ソリューションのビルド処理を忘れないようにしましょう。これにより、Proxy Classが生成され、クライアントからダイレクトにソリューションにアクセス可能となります。これらのプロジェクトが作成されているのは、プロジェクト作成Wizardで作成するときに、“.NET RIA Services enabled”をチェックした為です。
ToolboxからDataGridを選んでHomePage.xamlにドラッグ&ドロップします ( どんなコントロールでももちろんこのプロジェクトの中で動きます ) 。Home.Xamlに下記を追加します。
<Home.Xaml>
<data:DataGrid x:Name="dataGrid1" Height="300" Width=”800”></data:DataGrid>
<Home.Xaml.cs>
そしてコードビハインドファイル( HomePage.Xaml.cs)に、まずMyApp.Webへの参照を追加します。 using MyApp.Web;
これは何かちょっと奇妙な感じがしますが、要するにMyApp.Web は、サーバー側に定義されているということです。これで、クライアントプロキシにアクセスでき、サーバー側にあるDomainServices をローカルで操作できます。
public Home()
{
InitializeComponent();
var context = new SuperEmployeeDomainContext();
dataGrid1.ItemsSource = context.SuperEmployees;
context.Load(context.GetSuperEmployeesQuery());
}
最初の行では、SuperEmployeesDomainContextのインスタンスを作成しています。これは、client 側にあるSuperEmployeesDomainServiceです。次の行では、データグリッドに、当該SuperEmployeesを、データバインドしています。そして最後の行では、SuperEmployeesをロードしていますが、このクラスは、 サーバー側に定義されているGetSuperEmployees()メソッドです。
なおもちろん、これらはすべて非同期の処理であることに注意してください。ただ、ここで非同期の世界の複雑さを扱う必要は勿論ありません。Ctrl+F5で実行します。結果はこの通りです!
この状態では、ただ単にDataGridが自動的に生成したカラムを使って全件バインドしているのみで、ページングやソーティング、フィルタリングは全くできていません。そこで次回は、それらをひとつづつ、実行結果を確認しながらやっていきましょう。おもにXAMLのコーディング(Home.xaml)が中心となります。