エンタープライズ.Net RIAサービス

25
http://biki.jp.net/enterprisenet エンタープライズ.NET WCF RIA Service SilverlightWCF RIA Serviceによる ビジネスアプリケーション開発

Transcript of エンタープライズ.Net RIAサービス

Page 1: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

エンタープライズ.NETWCF RIA Service

SilverlightとWCF RIA Serviceによるビジネスアプリケーション開発

Page 2: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

目次 RIAアプリケーションとは サーバーサービスの構築

ドメインサービス データ操作 クエリーメソッドの追加 ドメインサービスへのアプリケーションロジックの追加 ドメインサービスのデータ 共有エンティティ クライアント・サーバー間の共有コード

クライアントUIの構築 レイアウト作成 DataForm DomainContextと操作 クライアントでのエラー処理 生成されたコードのカスタマイズ

2

Page 3: エンタープライズ.Net RIAサービス

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

Page 4: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

サーバーサービスの構築

データアクセス層

Entity Framework

ドメインサービス

4

Page 5: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービス

ドメインサービスは、WCF RIA サービスアプリケーションのビジネスロジックをカプセル化したWindows Communication Foundation (WCF) サービス

ドメインサービスとデータソース

DomainServiceクラスは、ドメインサービスとして機能するすべてのクラスの基本

ADO.NET エンティティモデルにバインドするドメインサービスを作成するには、LinqToEntitiesDomainServiceから派生

LINQ to SQL クラスを公開するドメインサービスを作成する場合は、LinqToSqlDomainServiceから派生

RIA Services Toolkit で提供

5

Page 6: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービス

ドメインサービスの公開 ウイザードでドメインサービスを作成することが可能

ドメインサービスクラスは、サービスをクライアントプロジェクトで使用できるようにするため、EnableClientAccessAttribute属性でマークする必要がある

ウイザードで [クライアントアクセスの有効化] チェックボックスをオンにすると、ドメインサービスに自動的に適用される

クライアントへの公開 EnableClientAccessAttribute属性がドメインサービスに適用されると、

RIA サービスによってクライアントプロジェクトに対応するクラスが生成される たとえば、EnableClientAccessAttribute属性を、Employee というエンティティを公開する HRService というドメインサービスに適用すると、RIA サービスによって、HRContext というドメインコンテキストがクライアントプロジェクトに生成され、Employee エンティティのクライアントバージョンも生成されます

6

Page 7: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

データ操作 CRUD操作

データ操作の基本操作。決まった操作 Query

クエリ メソッドは、エンティティの 1 つのインスタンスか、T が有効なエンティティ型である IEnumerableまたは IQueryableを返す必要がある オーバーロードされたメソッドは使用できない

Update Update、Change、またはModifyから開始 戻り値がなし、パラメータがエンティティ型

Insert Insert、Add、または Createから開始 戻り値がなし、パラメータがエンティティ型

Delete Delete または Removeから開始 戻り値がなし、パラメータがエンティティ型

7

Page 8: エンタープライズ.Net RIAサービス

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

Page 9: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

クエリーメソッドの追加

クエリーメソッドの追加とカスタマイズ

特定の目的ごとにクエリーメソッドを追加、カスタマイズできる

既存のクエリーにソート順を追加の検索条件を付与してカスタマイズする

1つのエンティティを返すメソッドの追加

IsComposableをfalseにする。IsComposableをtrueにするとクライアントで検索条件を追加できる

パラメータを受け取るメソッドの追加

検索条件をサーバーのビジネスロジックで組み立てる場合に利用する

9

Page 10: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスへのアプリケーションロジックの追加 ドメインサービスクラスに必要なアプリケーションロジックを追加

ウィザードによって生成されるコードに追加

ロジックは、直接操作メソッドに追加することも、操作メソッドから呼び出されるメソッドに追加することも可能

CRUDメソッドにビジネスロジックを追加 ウイザードで[編集の有効化] を選択すると雛形を作成してくれる

エンティティを受け取って処理を記述する ビジネスロジック上の検証や計算処理を記述できる

名前付き更新メソッドを追加 クライアントでの操作をサーバーサイドでリプレイする。1つのエンティティに対して1回だけ 両方とも同じ

emp.ResetPassword();、Context.ResetPassword(emp);

呼び出し操作を追加 エンティティに関連付けない処理

※ Invoke属性は不要、LoadやSubmitChangesする必要はない

その他 クライアントからサービスとして呼び出されないように、IgnoreAttribute属性でマーク

10

Page 11: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスのデータ データの注釈と検証

DataTypeAttribute

RangeAttribute

RegularExpressionAttribute

RequiredAttribute

StringLengthAttribute

CustomValidationAttribute

INotifyDataErrorInfo 同期および非同期の検証をサポートするメンバーを定義します

データの同時実行 既定では、RIA サービスが元のエンティティ全体を変更された値と共にデータ アクセス層に渡して、データの同時実行を確認することはありません。その代わり、RIA サービスは、RoundtripOriginalAttribute属性でマークされたメンバーのみを格納し、渡します。 RIA サービスは、RoundtripOriginalAttribute属性、ConcurrencyCheckAttribute属性、または

TimestampAttribute属性でマークされたメンバーのみを格納

トランザクション RIA サービスフレームワークによってトランザクションが自動的に作成されることはありませんが、変更の送信時に明示的なトランザクションを追加できます

11

Page 12: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスのデータ コンポジットデータ(合成階層)

複数のエンティティを一つ塊にして処理できる仕組み 子孫エンティティのプロパティにCompositionAttribute属性を付与

子孫エンティティを読み込むためにはIncludeAttribute属性を適用し、クエリ メソッドに子孫エンティティを含める必要がある

ドメインサービス 親エンティティまたは子孫エンティティのクエリ メソッドが許可される

親エンティティなしで読み込まれた子孫エンティティを変更することはできない(例外)

子孫エンティティで許可される操作 親エンティティで更新が許可されている場合、子孫エンティティでは更新、挿入、および削除が許可される

親エンティティに名前付き更新メソッドがある場合、すべての子孫で更新が有効になっている必要がある

親エンティティで挿入または削除が許可されている場合、子孫エンティティでは対応する操作が再帰的に許可される

クライアント プロジェクト内での規則 子孫エンティティに変更が含まれる場合、変更の通知が親エンティティまで伝達される(HasChanges)

親エンティティを変更すると、その子孫エンティティすべて (変更されていない子孫を含む) が変更セットに含まれる

12

Page 13: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスのデータ プレゼンテーションモデル

データアクセス層内の複数のエンティティからデータを集計するデータモデル データアクセス層内のエンティティをクライアントに直接公開しないため、プレゼンテーションモデルのみを変更することで、データアクセス層での変更に対応できる

ドメインサービス 独自のプレゼンテーションモデルを作成してカスタムのドメインサービスを作成

プレゼンテーションモデルにも一意識別用のKey項目が必要

ドメインサービスはDomainServiceをベースにクエリメソッドを定義してデータ層を検索する

更新処理を定義することも可能 プレゼンテーションモデルの各項目の変更内容を対応するエンティティに設定する

変更を送信した後、中間層ロジックまたはデータソースで設定されている値をクライアントに渡すことができる

エンティティの値をプレゼンテーションモデルに再度マップするための Associate メソッドが用意されています

13

Page 14: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスのデータ 継承

公開する派生型を KnownTypeAttribute属性に含める必要がある ドメインサービスで公開した継承階層をそのままの構造で、クライアントプロジェクトに生成される。ルートクラスはEntity クラスから派生し、各派生クラスが生成される

クエリメソッド、名前付き更新メソッドもインタフェースはサーバーの定義と同じ

制限 継承はエンティティ型でのみサポートされています

ドメインサービス操作の戻り値またはパラメーターでは、インターフェイス型がサポートされていません

継承階層内の型のセットは、コード生成時に認識されている必要があります virtual修飾子は許可されていますが、対応するエンティティ型がクライアントで生成されるときは無視されます

ドメインサービス操作に対するメソッドのオーバーロードは許可されていません

new (C#) キーワードと Shadows (Visual Basic) キーワードはエンティティ型では使用できません

14

Page 15: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

ドメインサービスのデータ

関連付け

Entity Frameworkで生成している場合はAssociationAttributeを特別指定する必要はない

Include属性をつけるとクライアント側にもプロパティが生成される

複合型(Complex Type)

Entity

クライアントではComplexObjectをベースになる

15

Page 16: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

共有エンティティ

エンティティは、WCF RIA サービスアプリケーション内の複数のドメインサービス間で共有することができる 要は他のドメインサービスのエンティティを使えるということ

ドメインサービスを分けて開発できる

名前付更新はコンテキストを注意する 複数のコンテキストを利用している場合

それぞれのDomainServiceでエンティティを宣言した場合はドメインサービスのContextでオブジェクトは別になる。型は同じ

名前付更新は間違ったコンテキストで行うと例外で通知してくれる

16

Page 17: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

クライアント・サーバー間の共有コード

共有ソースファイル

共有の名前付け規則 (*.shared.csまたは *.shared.vb)) を使用してファイルを共有する場合は、ソースコードファイルを共有するための "プッシュ" モデルを実装します。共有ファイルは、コンパイル時に中間層プロジェクトからクライアントプロジェクトにアクティブにコピーされます

リンクファイル

リンクファイルの方法を使用する際は、ソースコードファイルを共有するための "プル" モデルを実装します。クライアント

プロジェクトにはファイルのコピーは含まれません。代わりに、クライアントプロジェクトはサーバープロジェクト内のファイルを参照するだけです

17

Page 18: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

クライアントUIの構築

Silverlightによる画面作成

レイアウト作成

入力検証

画面遷移

サーバーサービスの利用

18

Page 19: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

レイアウト作成

XAMLで画面レイアウトを作成する

主なコントロール

TextBox

Label(SDK)

ComboBox

CheckBox

DatePicker(SDK)

Button

DataGrid

DataForm(SDK)

19

Page 20: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

DataForm 単票編集するためのフォーム

コレクションを取り扱うためDataGridの単票版と考えてもいいかも

機能 データ移動 編集 (鉛筆)、新しいレコードの追加 (プラス記号)、およびレコードの削除 (マイナス記号)

編集モード時にキャンセルとコミットができる レイアウト

Display属性を利用してラベルタイトルやツールヒントを指定可能

検証 Required, StringLength, Range, RegularExpression, Customevalidationを指定して検証ルールを指定できる

動作を換える仕組み AutoCommit AutoEdit

AutoGenerateFields

LabelPosition

20

Page 21: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

DomainContextと操作 WCF RIA サービスを使用して Silverlight プロジェクトと中間層プロジェクトをリンクすると、RIA サービスにより、中間層で公開したエンティティおよび操作に基づいて、クライアントアプリケーションのクライアントプロキシクラスが生成されます DomainContextから派生するクラス

ドメインサービスと同じ名前空間を使用したドメイン コンテキスト クラスが生成されます

既定では、ドメイン コンテキストの名前には、ドメインサービスの名前付けに使用される Service ではなく、Context が接尾辞として使用されます。たとえば、HRService という名前のドメインサービスには、HRContext という名前の対応するドメイン コンテキストがあります

DomainContextクラスでは、クエリ、送信、および呼び出しの各ドメイン操作がサポートされています。各種操作には、進行中の非同期操作を表す、対応するクラスがあります。このようなクラスとしては、LoadOperation、SubmitOperation、およびInvokeOperationがあります。

エンティティ クラスとエンティティプロキシクラス 中間層内のエンティティ クラスと同じ名前および名前空間でプロキシ クラスが生成されます。

カスタム属性

共有コード

21

Page 22: エンタープライズ.Net RIAサービス

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

Page 23: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

クライアントでのエラー処理 WCF RIA サービスでは、データ操作のコールバック メソッドを指定し、そのコールバックメソッドでエラーをチェックすることで、エラーを処理します

データ読み込み時のエラー処理(いずれか) コールバックメソッドのパラメーターを持つ Load メソッドを使用します。このコールバックメソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。

データ送信時のエラー処理 SubmitChanges メソッドを使用して、コールバックメソッドをパラメーターとして指定します。このコールバック メソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。

呼び出し操作によるエラー処理 呼び出し操作を呼び出すときにコールバックメソッドを含めます。このコールバックメソッドでは、エラーを処理し、例外がスローされていないことを示すMarkErrorAsHandled メソッドを呼び出します。

23

Page 24: エンタープライズ.Net RIAサービス

http://biki.jp.net/enterprisenet

生成されたコードのカスタマイズ

RIA サービスでは、生成されたコードに部分メソッドが用意されており、このメソッドを個別のコードファイルに実装して、クライアント層コードをカスタマイズすることができます

部分メソッド

ドメインコンテキストクラス

OnCreated()

エンティティクラス

OnCreated()

OnLoaded(boolean)

On[PropertyName]Changing

On[PropertyName]Changed

On[CustomMethodName]Invoking

On[CustomMethodName]Invoked

24

Page 25: エンタープライズ.Net RIAサービス

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