1

私たちが取り組んでいるプロジェクトは、古典的な 3 層アーキテクチャです。層 1 はデータベース サーバー、層 2 はアプリケーション サービス、層 3 はプレゼンテーション層 (Web サイト) です。

アプリケーション サービス層には、エンティティ フレームワーク モデルと、モデル内のエンティティを公開する WCF データ サービス ベースのサービスを含むプロジェクトがあります。

public class DataService : DataService< PortalEntities >

これは、URI を介して照会できる本格的な OData サービスです/dataservice.svc/mytable?$filter=contains(fieldname,’string’)。これは、クエリを定義するだけでよいため、jQuery を使用して何かを開発している人にとっては素晴らしいことです。問題は、このサービスが中間層であるため、外部からは見えないことです。

私が試みている解決策は、サービス参照によって作成されたエンティティを公開する Web サイトで別の WCF データ サービスを公開することです。中間層サービスへのサービス参照を追加すると、データ コンテキストが新しい WCF データ サービスで使用されているというデータ コンテキストが得られます。

public class DataService : DataService< PortalEntities >

CreateDataSource を上書きする必要があります。

protected override PortalEntities CreateDataSource()
{
    return new PortalEntities(GetMianModelServiceUri());
} 

新しいサービスはプロキシのように機能し、公開されたエンティティを返します (クエリは正常に.../Services/OData/DataService.svc/tbl_Country機能します)。

ただし、クエリがサービスに渡されると、たとえば.../OData/DataService.svc/tbl_Country?$select=Name、実装されていない例外がスローされます。

中間層サービスと同じクエリをサポートするように Web サイト サービスを拡張する方法について何かアイデアはありますか?

4

2 に答える 2

1

データ サーバーの形状や機能を変更する必要がない場合は、透過的な HTTP プロキシと同様に、要求と応答を単純に転送できるはずです。必要な唯一の違いは、サービス URL を微調整することです。プロキシ サービスは実際のサービスとは異なるベース URI を持つため、ペイロードには (リンクなどに) 実際のサービス URI が含まれますが、これは機能しません。これを回避するには、実際のサービスにカスタム ホストを使用し、その URI について嘘をつきます。これは IDataServiceHost2 インターフェイスを介して行われ、AbsoluteRquestUri および AbsoluteServiceUri プロパティから「新しい」URI を返します。インターフェイスの実装の素敵なサンプル (目的は異なりますが) は次のとおりです。http://blogs.msdn.com/b/tom_laird-mcconnell/archive/2010/01/18/using-ado-net-wcf-data-services-for-streaming-infinite-event-result-sets.aspx .

形状や機能を変更する必要がある場合は、真のレイヤリングが必要です。

1 つの WCF データ サービスを別のサービスの上に重ねることは、現時点ではかなり困難です。「サーバー」によって生成された LINQ 式ツリーは、「クライアント」LINQ プロバイダーによって常に理解されるとは限りません。それがあなたが遭遇しているものです。

式ツリーを書き直すことで、これをある程度機能させるプロトタイプ (実験のようなもの) があります。これは、 http: //www.odata.org/developers/odata-sdk#/media/7579/odataprovidertoolkit.zip からダウンロードできる OData プロバイダー ツールキットの一部です。(Experimental フォルダー、AstoriaOverAstoria プロジェクトにあります)。

ただし、これは実際には、どのような問題を解決する必要があるかなどを示すための実験にすぎないことに注意してください。どのような種類の本番環境でも使用しないことを強くお勧めします。

于 2010-06-15T07:35:35.290 に答える
0

アプリ層のサービス (直接データではない) を参照する Web 層のサービスを公開できることがわかりました。これは、現時点ではクエリに対してのみ機能します。更新、削除などのために何が必要なのかわかりません。何かアイデアはありますか? とにかく、ここにいくつかの指示とコードスニペットがあります:

  1. 最初に、edmx モデルにバインドされたアプリ層に WCF データ サービスを作成します。
  2. 次に、edmx モデル (カスタム) にバインドされていない Web 層に WCF Data Service を作成します。
  3. Web 層サービスでアプリケーション層サービスへのサービス参照を作成します。
  4. Entities 型を DataService ジェネリック宣言に渡します (VB では山かっこである必要がありますが、表示できませんでした:

        Public MyWebTierService 
        Inherits DataService[MyServiceReference.MyAppTierEntities]
  1. アプリケーション層への参照を作成する CreateDataSource() のオーバーライドを追加します。

 Protected Overrides Function CreateDataSource() As MyServiceReference.MyAppTierEntities
        Dim ctx = New MyServiceReference.MyAppTierEntities(New Uri("http://yourappservicelocation/AppService.svc/"))
        Return ctx
    End Function

あとは、サービスへの参照を作成するか、OData をサポートするクライアント アプリにバインドするだけです。必要に応じて、JSONP サポートを追加できます。

したがって、これはクエリでは正常に機能しますが、更新では機能しません。これは、おそらくタイプが同じではないためです (同じように見えるかもしれませんが、最終的には異なるアセンブリにあります)。そのため、Web 層とアプリケーション層の間で追跡が失われます。

これを解決するには、Web 層に IUpdatable を実装する必要があるかもしれません。まだわからないので、入力は役に立ちます。

お役に立てれば

于 2011-10-13T12:05:50.280 に答える