次の方法で共有


ドメイン サービス

ドメイン サービスは、WCF RIA サービス アプリケーションのビジネス ロジックをカプセル化した Windows Communication Foundation (WCF) サービスです。ドメイン サービスは、関連する操作セットをサービス レイヤー形式で公開します。ドメイン サービスを定義する場合、ドメイン サービスを通じて許可されるデータ操作を指定します。

ドメイン サービスをデザインする際は、ドメイン サービスを、ユーザーがアプリケーションで実行することが予想される一連の関連タスクと見なす必要があります。通常、そのようなタスクは密接に関連するエンティティの小さいグループを伴います。たとえば、経費報告アプリケーションでは、経費明細書、品目、および詳細のエンティティを公開してから、個々のドメイン サービスにアカウントと支払いのエンティティを配置できます。

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

DomainService クラスは、ドメイン サービスとして機能するすべてのクラスの基本クラスです。カスタム データ オブジェクトにバインドするドメイン サービスを作成するには、DomainService から直接派生するクラスを作成します。ただし、ADO.NET エンティティ モデルをバインドするか、LINK to SQL データベースを公開するドメイン サービスがある場合、代わりに使用する DomainService から派生する特殊な抽象クラスがあります。

  • ADO.NET エンティティ モデルにバインドするドメイン サービスを作成するには、LinqToEntitiesDomainService から派生するクラスを作成します。RIA サービス には、LinqToEntitiesDomainService クラスが用意されています。

  • アプリケーションで LINQ to SQL クラスを公開するドメイン サービスを作成する場合は、LinqToSqlDomainService から派生するクラスを作成します。このクラスは、RIA Services Toolkit で提供されています。このクラスを使用してアプリケーションで LINQ to SQL クラスを公開するドメイン サービスを作成する場合は、RIA サービス Toolkit をダウンロードする必要があります。

[新しいドメイン サービス クラスの追加] ダイアログ ボックスを使用してドメイン サービスを作成する場合、作成されるドメイン サービスの種類は公開するエンティティに基づきます。

ドメイン サービス クラスは、サービスをクライアント プロジェクトで使用できるようにするため、EnableClientAccessAttribute 属性でマークする必要があります。EnableClientAccessAttribute 属性は、[新しいドメイン サービス クラスを追加] ダイアログ ボックスの [クライアント アクセスの有効化] チェック ボックスをオンにすると、ドメイン サービスに自動的に適用されます。EnableClientAccessAttribute 属性がドメイン サービスに適用されると、RIA サービス によってクライアント プロジェクトに対応するクラスが生成されます。たとえば、EnableClientAccessAttribute 属性を、Employee というエンティティを公開する HRService というドメイン サービスに適用すると、RIA サービス によって、HRContext というドメイン コンテキストがクライアント プロジェクトに生成され、Employee エンティティのクライアント バージョンも生成されます。

WCF サービスとドメイン サービス

ドメイン サービスは、Windows Communication Foundation (WCF) サービスとして WCF の概念に基づいて作成されます。ドメイン サービスでは、次のものが保持されます。

  • WCF サービスの標準的使用方法

  • 既存の WCF プログラミング モデルのコンストラクター (操作コントラクト、操作の動作、サービスの動作など)

  • 標準の WCF カスタマイズ機能 (バインディング構成、動作の構成、管理インフラストラクチャなど)

ドメイン コンテキストが RIA サービス ドメイン サービスと通信するには、WCF ChannelFactory を使用してチャネルを作成し、作成したチャネルにドメイン サービスから生成されたサービス コントラクトを渡します。

既定では、ドメイン サービスに対して有効なのはバイナリ エンドポイントだけです。バイナリ エンドポイントを使用するために、追加の構成は必要ありません。別のエンドポイント (OData、JSON、SOAP、カスタム ホストなど) を使用する場合は、次のように、Web.config ファイルにエンドポイント ファクトリを登録する必要があります。

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

System.ServiceModel.DomainServices.Hosting 名前空間には、RIA サービス でサポートされているエンドポイントが含まれています。Microsoft.ServiceModel.DomainServices.Hosting 名前空間には、前の例で示した JsonEndpointFactory など、RIA サービス Toolkit でサポートされているエンドポイントが含まれています。カスタム エンドポイントを作成するには、DomainServiceEndpointFactory クラスから派生するクラスを作成し、CreateEndpoints メソッドをオーバーライドする必要があります。

データ操作

公開するデータ操作を実行するドメイン サービスにメソッドを追加します。たとえば、次の操作を実行するメソッドを追加できます。

  • Query

  • Update

  • Insert

  • Delete

また、次のようなさらに複雑な操作を追加することもできます。

  • Invoke: 追跡または遅延実行を行わずに実行する必要のある操作を実装します。このメソッドは、エンティティ以外のデータを使用する場合か、代わりにクエリ操作、更新操作、挿入操作、または削除操作を使用できない場合にのみ使用されます。

  • Named Update: 単純な変更操作に分類されないカスタム操作を実装します。

ドメイン サービスを公開すると、クライアントから許可されている操作 (挿入、更新、または削除) を示すプロパティが指定された状態で、ドメイン コンテキスト内に EntitySet オブジェクトが生成されます。データ変更を実行するには、エンティティ コレクションを変更してから SubmitChanges メソッドを呼び出します。

ほとんどのシナリオでは、データを読み込む際、呼び出し操作の代わりにクエリ操作を使用してください。クエリ メソッドは、単一の Entity オブジェクト、IQueryable<Entity> オブジェクト、または IEnumerable<Entity> オブジェクトを返します。クエリ メソッドは、中間層の DomainService およびクライアントの DomainContext によってサポートされるデータ パターンの整数部です。RIA サービス フレームワークは、DomainService でクエリ メソッドから返されるこれらのエンティティに対してのみクライアント プロジェクト内にエンティティを生成します。

呼び出し操作では、エンティティ以外のデータを返して副作用を伴う操作を実行するための帯域外メカニズムを提供します。副作用の詳細については、HasSideEffects プロパティに関するトピックを参照してください。通常、呼び出し操作はクエリ メソッドには適していません。呼び出し操作でエンティティが返された場合でも、クエリ メソッドによって返された場合にのみ、クライアント プロジェクトにエンティティが生成されます。

規則

このような操作を実行するためのメソッドを追加する場合、メソッドはその操作に予想されるシグネチャと一致する必要があります。シグネチャの一致に加え、メソッドには、そのデータ操作の名前付け規則と一致する名前プレフィックスを含める必要があります。メソッドの名前の先頭に予想されるプレフィックスがない場合は、その操作に対応する属性を適用する必要があります。操作の名前が名前付け規則と一致する場合、属性は省略できます。名前付け規則を使用すると、開発者にとってより一貫性のある操作が可能になります。

ドメイン操作であるメソッドをオーバーロードすることはできません。クライアント プロジェクトから呼び出すことのできる各メソッドには、一意の名前を指定する必要があります。ドメイン サービス操作を表すすべてのメソッドはパブリックである必要があります。メソッドはパラメーターと戻り値の型にシリアル化可能な型を使用する必要があります。

IgnoreAttribute 属性をメソッドに追加することで、そのメソッドが公開されないようにすることができます。

データ操作のシグネチャを次の表に示します。

クエリ

クエリ メソッドは、エンティティの 1 つのインスタンスか、T が有効なエンティティ型である IEnumerable または IQueryable を返す必要があります。オーバーロードされたメソッドは使用できないため、異なる入力パラメーター (GetEmployees()GetEmployeesByLastName(string lastname) など) を受け取る各メソッドに一意の名前を指定する必要があります。

クエリ操作に予想されるシグネチャの値を次の表に示します。

戻り値

IEnumerable<T>IQueryable<T>、またはエンティティ

パラメーター

任意の数のパラメーター

名前のプレフィックス

任意の名前

属性

[Query] (C#)

または

<Query()> (Visual Basic)

詳細については、QueryAttribute に関するトピックを参照してください。

public IQueryable<Product> GetProducts() (C#)

または

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

更新

更新操作に予想されるシグネチャの値を次の表に示します。

戻り値

なし

パラメーター

Entity

名前のプレフィックス

Update、Change、または Modify

属性

[Update] (C#)

または

<Update()> (Visual Basic)

詳細については、UpdateAttribute に関するトピックを参照してください。

public void UpdateProduct(Product product) (C#)

または

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

挿入

挿入操作に予想されるシグネチャの値を次の表に示します。

戻り値

なし

パラメーター

Entity

名前のプレフィックス

Insert、Add、または Create

属性

[Insert] (C#)

または

<Insert()> (Visual Basic)

詳細については、InsertAttribute に関するトピックを参照してください。

public void InsertProduct(Product product) (C#)

または

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

削除

削除操作に予想されるシグネチャの値を次の表に示します。

戻り値

なし

パラメーター

Entity

名前のプレフィックス

Delete または Remove

属性

[Delete] (C#)

または

<Delete()> (Visual Basic)

詳細については、DeleteAttribute に関するトピックを参照してください。

public void DeleteProduct(Product product) (C#)

または

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

呼び出し

呼び出し操作では、エンティティ以外のデータを返して副作用を伴う操作を実行するための帯域外メカニズムを提供します。副作用の詳細については、HasSideEffects プロパティに関するトピックを参照してください。通常、呼び出し操作はクエリ メソッドには適していません。

呼び出し操作に予想されるシグネチャの値を次の表に示します。

戻り値

どれでも可

パラメーター

任意の数のパラメーター

名前のプレフィックス

どれでも可

属性

[Invoke] (C#)

または

<Invoke> (Visual Basic)

詳細については、InvokeAttribute に関するトピックを参照してください。

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

または

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

名前付き更新

名前付き更新操作に予想されるシグネチャの値を次の表に示します。

戻り値

なし

パラメーター

Entity

任意数のその他のパラメーター

名前のプレフィックス

Insert、Update、または Delete のプレフィックスから始まらない任意の名前

属性

[Update(UsingCustomMethod=true] (C#)

または

<Update(UsingCustomMethod:=True)> (Visual Basic)

詳細については、UpdateAttribute に関するトピックを参照してください。

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

または

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

ドメイン サービスへのアプリケーション ロジックの追加

公開されたデータ操作を定義したら、ドメイン サービス クラスに必要なアプリケーション ロジックを追加できます。ウィザードによって生成されるコードは、アプリケーション ロジックの記述を開始できるようにすることのみを目的としています。ロジックは、直接操作メソッドに追加することも、操作メソッドから呼び出されるメソッドに追加することもできます。アプリケーションに必要な機能を提供するには、既存のメソッドにパラメーターを追加するか、メソッドの実装をカスタマイズするか、新しいメソッドを追加します。ビジネス ロジックの実装の詳細については、「方法: ドメイン サービスにビジネス ロジックを追加する」を参照してください。

ドメイン サービスを実装する場合は、サービスを介してデータを公開する際のセキュリティ リスクを慎重に考慮する必要があります。セキュリティの詳細については、「WCF RIA Services のセキュリティ」を参照してください。

参照

概念

DomainContext と操作
WCF RIA Services のセキュリティ