http://biki.jp.net/enterprisenet
エンタープライズ.NETWCF RIA Service
SilverlightとWCF RIA Serviceによるビジネスアプリケーション開発
http://biki.jp.net/enterprisenet
目次 RIAアプリケーションとは サーバーサービスの構築
ドメインサービス データ操作 クエリーメソッドの追加 ドメインサービスへのアプリケーションロジックの追加 ドメインサービスのデータ 共有エンティティ クライアント・サーバー間の共有コード
クライアントUIの構築 レイアウト作成 DataForm DomainContextと操作 クライアントでのエラー処理 生成されたコードのカスタマイズ
2
http://biki.jp.net/enterprisenet
RIAアプリケーションとは Silverlight アプリケーションなどのリッチインターネットアプリケーション (RIA) 用の
n 層のアプリケーション
Silverlight 動画やアニメーションを利用したリッチなWebコンテンツや業務用アプリケーションを動かすためのWebブラウザプラグイン(追加機能)。 ブラウザー外実行 ・豊富な標準コントロール ・高度なカスタマイズ性
データバインディング ・.NET Framework との互換性 ・印刷機能
Web サービス対応
WCF RIA Service WCF RIA サービスは、Silverlight アプリケーションなどのリッチ インターネットアプリケーション (RIA) 用の、n 層のソリューションの開発を簡略化する。 RIA サービスは、サーバー上のアプリケーションロジックを手動で複製せずに、そのロジックを RIA サービスクライアントが使用できるようにするフレームワークコンポーネント、ツール、およびサービスを提供する。
3
http://biki.jp.net/enterprisenet
サーバーサービスの構築
データアクセス層
Entity Framework
ドメインサービス
4
http://biki.jp.net/enterprisenet
ドメインサービス
ドメインサービスは、WCF RIA サービスアプリケーションのビジネスロジックをカプセル化したWindows Communication Foundation (WCF) サービス
ドメインサービスとデータソース
DomainServiceクラスは、ドメインサービスとして機能するすべてのクラスの基本
ADO.NET エンティティモデルにバインドするドメインサービスを作成するには、LinqToEntitiesDomainServiceから派生
LINQ to SQL クラスを公開するドメインサービスを作成する場合は、LinqToSqlDomainServiceから派生
RIA Services Toolkit で提供
5
http://biki.jp.net/enterprisenet
ドメインサービス
ドメインサービスの公開 ウイザードでドメインサービスを作成することが可能
ドメインサービスクラスは、サービスをクライアントプロジェクトで使用できるようにするため、EnableClientAccessAttribute属性でマークする必要がある
ウイザードで [クライアントアクセスの有効化] チェックボックスをオンにすると、ドメインサービスに自動的に適用される
クライアントへの公開 EnableClientAccessAttribute属性がドメインサービスに適用されると、
RIA サービスによってクライアントプロジェクトに対応するクラスが生成される たとえば、EnableClientAccessAttribute属性を、Employee というエンティティを公開する HRService というドメインサービスに適用すると、RIA サービスによって、HRContext というドメインコンテキストがクライアントプロジェクトに生成され、Employee エンティティのクライアントバージョンも生成されます
6
http://biki.jp.net/enterprisenet
データ操作 CRUD操作
データ操作の基本操作。決まった操作 Query
クエリ メソッドは、エンティティの 1 つのインスタンスか、T が有効なエンティティ型である IEnumerableまたは IQueryableを返す必要がある オーバーロードされたメソッドは使用できない
Update Update、Change、またはModifyから開始 戻り値がなし、パラメータがエンティティ型
Insert Insert、Add、または Createから開始 戻り値がなし、パラメータがエンティティ型
Delete Delete または Removeから開始 戻り値がなし、パラメータがエンティティ型
7
http://biki.jp.net/enterprisenet
データ操作 複雑な操作
Invoke CRUD以外のメソッド呼び出し用
任意の戻り値、パラメータ
追跡または遅延実行を行わずに実行する必要のある操作を実装します。このメソッドは、エンティティ以外のデータを使用する場合か、代わりにクエリ操作、更新操作、挿入操作、または削除操作を使用できない場合にのみ使用されます。
Named Update サーバーサイドで引数をもらってアプリケーションロジックを記述する場合に利用
エンティティに関連するトランザクション処理の実行 単純な変更操作に分類されないカスタム操作を実装
Insert、Update、または Delete のプレフィックスから始まらない任意の名前
戻り値がなし、パラメータがエンティティ型と任意数のその他のパラメーター
HasSideEffectsをtrueにするとPOSTで発行される http://hashtagfail.com/post/1000967093/wcf-routing-ria-services GetはキャッシュされるためそれをさけるためにPOSTで実行するだけ。SideEffectには深い意味は無さそう
8
http://biki.jp.net/enterprisenet
クエリーメソッドの追加
クエリーメソッドの追加とカスタマイズ
特定の目的ごとにクエリーメソッドを追加、カスタマイズできる
既存のクエリーにソート順を追加の検索条件を付与してカスタマイズする
1つのエンティティを返すメソッドの追加
IsComposableをfalseにする。IsComposableをtrueにするとクライアントで検索条件を追加できる
パラメータを受け取るメソッドの追加
検索条件をサーバーのビジネスロジックで組み立てる場合に利用する
9
http://biki.jp.net/enterprisenet
ドメインサービスへのアプリケーションロジックの追加 ドメインサービスクラスに必要なアプリケーションロジックを追加
ウィザードによって生成されるコードに追加
ロジックは、直接操作メソッドに追加することも、操作メソッドから呼び出されるメソッドに追加することも可能
CRUDメソッドにビジネスロジックを追加 ウイザードで[編集の有効化] を選択すると雛形を作成してくれる
エンティティを受け取って処理を記述する ビジネスロジック上の検証や計算処理を記述できる
名前付き更新メソッドを追加 クライアントでの操作をサーバーサイドでリプレイする。1つのエンティティに対して1回だけ 両方とも同じ
emp.ResetPassword();、Context.ResetPassword(emp);
呼び出し操作を追加 エンティティに関連付けない処理
※ Invoke属性は不要、LoadやSubmitChangesする必要はない
その他 クライアントからサービスとして呼び出されないように、IgnoreAttribute属性でマーク
10
http://biki.jp.net/enterprisenet
ドメインサービスのデータ データの注釈と検証
DataTypeAttribute
RangeAttribute
RegularExpressionAttribute
RequiredAttribute
StringLengthAttribute
CustomValidationAttribute
INotifyDataErrorInfo 同期および非同期の検証をサポートするメンバーを定義します
データの同時実行 既定では、RIA サービスが元のエンティティ全体を変更された値と共にデータ アクセス層に渡して、データの同時実行を確認することはありません。その代わり、RIA サービスは、RoundtripOriginalAttribute属性でマークされたメンバーのみを格納し、渡します。 RIA サービスは、RoundtripOriginalAttribute属性、ConcurrencyCheckAttribute属性、または
TimestampAttribute属性でマークされたメンバーのみを格納
トランザクション RIA サービスフレームワークによってトランザクションが自動的に作成されることはありませんが、変更の送信時に明示的なトランザクションを追加できます
11
http://biki.jp.net/enterprisenet
ドメインサービスのデータ コンポジットデータ(合成階層)
複数のエンティティを一つ塊にして処理できる仕組み 子孫エンティティのプロパティにCompositionAttribute属性を付与
子孫エンティティを読み込むためにはIncludeAttribute属性を適用し、クエリ メソッドに子孫エンティティを含める必要がある
ドメインサービス 親エンティティまたは子孫エンティティのクエリ メソッドが許可される
親エンティティなしで読み込まれた子孫エンティティを変更することはできない(例外)
子孫エンティティで許可される操作 親エンティティで更新が許可されている場合、子孫エンティティでは更新、挿入、および削除が許可される
親エンティティに名前付き更新メソッドがある場合、すべての子孫で更新が有効になっている必要がある
親エンティティで挿入または削除が許可されている場合、子孫エンティティでは対応する操作が再帰的に許可される
クライアント プロジェクト内での規則 子孫エンティティに変更が含まれる場合、変更の通知が親エンティティまで伝達される(HasChanges)
親エンティティを変更すると、その子孫エンティティすべて (変更されていない子孫を含む) が変更セットに含まれる
12
http://biki.jp.net/enterprisenet
ドメインサービスのデータ プレゼンテーションモデル
データアクセス層内の複数のエンティティからデータを集計するデータモデル データアクセス層内のエンティティをクライアントに直接公開しないため、プレゼンテーションモデルのみを変更することで、データアクセス層での変更に対応できる
る
ドメインサービス 独自のプレゼンテーションモデルを作成してカスタムのドメインサービスを作成
プレゼンテーションモデルにも一意識別用のKey項目が必要
ドメインサービスはDomainServiceをベースにクエリメソッドを定義してデータ層を検索する
更新処理を定義することも可能 プレゼンテーションモデルの各項目の変更内容を対応するエンティティに設定する
変更を送信した後、中間層ロジックまたはデータソースで設定されている値をクライアントに渡すことができる
エンティティの値をプレゼンテーションモデルに再度マップするための Associate メソッドが用意されています
13
http://biki.jp.net/enterprisenet
ドメインサービスのデータ 継承
公開する派生型を KnownTypeAttribute属性に含める必要がある ドメインサービスで公開した継承階層をそのままの構造で、クライアントプロジェクトに生成される。ルートクラスはEntity クラスから派生し、各派生クラスが生成される
クエリメソッド、名前付き更新メソッドもインタフェースはサーバーの定義と同じ
制限 継承はエンティティ型でのみサポートされています
ドメインサービス操作の戻り値またはパラメーターでは、インターフェイス型がサポートされていません
継承階層内の型のセットは、コード生成時に認識されている必要があります virtual修飾子は許可されていますが、対応するエンティティ型がクライアントで生成されるときは無視されます
ドメインサービス操作に対するメソッドのオーバーロードは許可されていません
new (C#) キーワードと Shadows (Visual Basic) キーワードはエンティティ型では使用できません
14
http://biki.jp.net/enterprisenet
ドメインサービスのデータ
関連付け
Entity Frameworkで生成している場合はAssociationAttributeを特別指定する必要はない
Include属性をつけるとクライアント側にもプロパティが生成される
複合型(Complex Type)
Entity
クライアントではComplexObjectをベースになる
15
http://biki.jp.net/enterprisenet
共有エンティティ
エンティティは、WCF RIA サービスアプリケーション内の複数のドメインサービス間で共有することができる 要は他のドメインサービスのエンティティを使えるということ
ドメインサービスを分けて開発できる
名前付更新はコンテキストを注意する 複数のコンテキストを利用している場合
それぞれのDomainServiceでエンティティを宣言した場合はドメインサービスのContextでオブジェクトは別になる。型は同じ
名前付更新は間違ったコンテキストで行うと例外で通知してくれる
16
http://biki.jp.net/enterprisenet
クライアント・サーバー間の共有コード
共有ソースファイル
共有の名前付け規則 (*.shared.csまたは *.shared.vb)) を使用してファイルを共有する場合は、ソースコードファイルを共有するための "プッシュ" モデルを実装します。共有ファイルは、コンパイル時に中間層プロジェクトからクライアントプロジェクトにアクティブにコピーされます
リンクファイル
リンクファイルの方法を使用する際は、ソースコードファイルを共有するための "プル" モデルを実装します。クライアント
プロジェクトにはファイルのコピーは含まれません。代わりに、クライアントプロジェクトはサーバープロジェクト内のファイルを参照するだけです
17
http://biki.jp.net/enterprisenet
クライアントUIの構築
Silverlightによる画面作成
レイアウト作成
入力検証
画面遷移
サーバーサービスの利用
18
http://biki.jp.net/enterprisenet
レイアウト作成
XAMLで画面レイアウトを作成する
主なコントロール
TextBox
Label(SDK)
ComboBox
CheckBox
DatePicker(SDK)
Button
DataGrid
DataForm(SDK)
19
http://biki.jp.net/enterprisenet
DataForm 単票編集するためのフォーム
コレクションを取り扱うためDataGridの単票版と考えてもいいかも
機能 データ移動 編集 (鉛筆)、新しいレコードの追加 (プラス記号)、およびレコードの削除 (マイナス記号)
編集モード時にキャンセルとコミットができる レイアウト
Display属性を利用してラベルタイトルやツールヒントを指定可能
検証 Required, StringLength, Range, RegularExpression, Customevalidationを指定して検証ルールを指定できる
動作を換える仕組み AutoCommit AutoEdit
AutoGenerateFields
LabelPosition
20
http://biki.jp.net/enterprisenet
DomainContextと操作 WCF RIA サービスを使用して Silverlight プロジェクトと中間層プロジェクトをリンクすると、RIA サービスにより、中間層で公開したエンティティおよび操作に基づいて、クライアントアプリケーションのクライアントプロキシクラスが生成されます DomainContextから派生するクラス
ドメインサービスと同じ名前空間を使用したドメイン コンテキスト クラスが生成されます
既定では、ドメイン コンテキストの名前には、ドメインサービスの名前付けに使用される Service ではなく、Context が接尾辞として使用されます。たとえば、HRService という名前のドメインサービスには、HRContext という名前の対応するドメイン コンテキストがあります
DomainContextクラスでは、クエリ、送信、および呼び出しの各ドメイン操作がサポートされています。各種操作には、進行中の非同期操作を表す、対応するクラスがあります。このようなクラスとしては、LoadOperation、SubmitOperation、およびInvokeOperationがあります。
エンティティ クラスとエンティティプロキシクラス 中間層内のエンティティ クラスと同じ名前および名前空間でプロキシ クラスが生成されます。
カスタム属性
共有コード
21
http://biki.jp.net/enterprisenet
DomainContext と操作 クエリ
クエリ メソッドの名前は、ドメイン サービスのクエリ メソッドに Query という接尾辞を加えたもの。 EntityQueryオブジェクトを返します。 ドメインコンテキストからのすべてのクエリが非同期的に実行されます。
クエリを実行するには、Load メソッドにパラメーターとして EntityQueryオブジェクトを渡す
LINQを利用するためにはSystem.ServiceModel.DomainServices.Clientの名前空間をインポート
利用可能なクエリ演算子 Where、OrderBy、ThenBy、Skip、Take
データの変更 エンティティを更新、挿入、および削除するためのメソッドはドメイン コンテキスト内に生成されません。代わりに、ドメイン コンテキストの SubmitChanges メソッドを使用すると、クライアントの変更内容がサーバにまとめて送信され処理される
また、DomainContext クラスには、HasChanges プロパティと EntityContainerプロパティも用意されており、保留中の変更を評価できます。
名前付き更新メソッド ドメインサービスのメソッドと同じ名前が生成
クライアント プロジェクトで、メソッドを呼び出しても、実際には SubmitChangesが呼び出されるまでこのメソッドは実行されません エンティティのインスタンスを介しても呼び出すことができる
呼び出し操作 ドメインサービスの各呼び出し操作に使用するメソッドが生成される
呼び出し操作はすぐに実行されます。SubmitChanges メソッドは呼び出しません
22
http://biki.jp.net/enterprisenet
クライアントでのエラー処理 WCF RIA サービスでは、データ操作のコールバック メソッドを指定し、そのコールバックメソッドでエラーをチェックすることで、エラーを処理します
データ読み込み時のエラー処理(いずれか) コールバックメソッドのパラメーターを持つ Load メソッドを使用します。このコールバックメソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。
データ送信時のエラー処理 SubmitChanges メソッドを使用して、コールバックメソッドをパラメーターとして指定します。このコールバック メソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。
呼び出し操作によるエラー処理 呼び出し操作を呼び出すときにコールバックメソッドを含めます。このコールバックメソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。
23
http://biki.jp.net/enterprisenet
生成されたコードのカスタマイズ
RIA サービスでは、生成されたコードに部分メソッドが用意されており、このメソッドを個別のコードファイルに実装して、クライアント層コードをカスタマイズすることができます
部分メソッド
ドメインコンテキストクラス
OnCreated()
エンティティクラス
OnCreated()
OnLoaded(boolean)
On[PropertyName]Changing
On[PropertyName]Changed
On[CustomMethodName]Invoking
On[CustomMethodName]Invoked
24
http://biki.jp.net/enterprisenet
資料
http://msdn.microsoft.com/ja-jp/library/ee707344(v=vs.91).aspx
http://www.nikhilk.net/RIAServices-Link-Listing-1.aspx
25
Top Related