0

プレゼンテーション層 (MVVM ベースのクライアント) とビジネス層の間の通信を必要とするプロジェクトに取り組んでいます。アプリケーションは 1 台のマシンにインストールされるため、.net リモート処理ベースのアプローチを使用して実行することもできます。ただし、.net リモーティングは推奨されておらず、WCF が適しているため、WCF を使用するよう提案されています。

そこで、WCF Service を WCF ライブラリ プロジェクトとして実装しました。クライアント側で正常に追加されたサービス参照を追加しました (ソリューション内のサービスを検出することにより、ビジュアル スタジオ ツールを使用)。デバッグ セッション中に Visual Studio がサービス ライブラリを起動し、クライアントが正常に接続できるため、すべてが正常に機能します。

クライアントとサービス ホストが同じマシンにインストールされるため、名前付きパイプ トランスポートとセルフ ホスティングを WCF サービスに使用することを考えていました。これが私にとって非常に混乱するところです:-

  1. MVVM クライアントは "メイン" アプリであるため (アプリケーションのフロントエンドであるため)、クライアントが最初に起動されます。クライアントがサービス ホストを必要とするときに、サービス ホストを「オンデマンド」で起動するソリューションを思いつくことができません。
  2. 1に必要なことを行うために使用できるソリューションは何ですか? 「オンデマンド」で必要となるものに対して、Windows サービスを介した継続的なサービスを使用するかどうかはわかりません。
  3. 「オンデマンド」サービスを開始する方法を実装するためのクリーンなアプローチを提案してください。前もって感謝します。
4

1 に答える 1

0

私はここであなたを完全にフォローしていません。MVVM はケーキであり、実際には問題とは何の関係もありません。今日、サービスベースのアーキテクチャを使用することは必須です。私は、クライアント側で直接 SQL に固執しているすべての老人/ギャルを叩きたいだけであり、それによる危険性を認識していません。

とにかく、このさまざまな方法で解決できます。私の意見では、WCFはBIGです。アプリ (WP8.1、8.1 アプリ ++) のような小さなアプリケーションで一般的な使用方法の 1 つは、接続し、必要なメソッドを呼び出して、接続を閉じることです。あなたのニーズを理解したので、ケースは解決しました。他の方法は、各サービスのセッションを維持することです...(うーん、ロードバランシングなど)。

私は過去 4 年間、大規模な LOB アプリケーションに取り組んできました。一度だけ、SSL over HTTP を使用した JSON エンドポイントと json.net シリアライザーを使用しました。WCF のデフォルトである datacontract シリアライザーは、まったく良いニュースではありません。JSON は JavaScript ベースのアプリケーションとの簡単な通信を可能にし、シリアライザーは datacontract シリアライザーのように磁器のように壊れることはありません。アドレス/ベースアドレスは構成ファイルに保存される場合があるため、展開時に変更される場合があります (さまざまな環境で、おそらく多くのサーバーがあるでしょう)。

これは、主題をカバーする非常に古い投稿です (JSON 以外の SOAP をサポートしています)。WCF サービスの REST / SOAP エンドポイント

ばかげてはいけません。今すぐサービスを直接呼び出してください。インターフェイスを使用して (必要に応じてラップ)、適切な TDD のためにビューモデルにフィードします。また、WCF を別の形式の通信に完全に置き換えることもできます。

WCF に代わるものもあります。

IIS? 適切なサービスではなく、IIS で WCF をホストしていますか? まさか、その考えをウォータールーに流してはいけません ;) (社内ジョーク)

編集:

ところで:クライアントがサービスに接続するには、サービスがすでに実行されている必要があります。または、構成されたポートをリッスンするものは何もありません。セルフホスティングの場合は、パラメータを使用してデバッグ モードで開始できます。つまり、デバッグできる通常のアプリケーションのようにサービスを開始できます。Program.cs;

if (args.Length > 0 && String.Equals(args[0],"debugmode", StringComparison.OrdinalIgnoreCase)
{                    
    Service1.Create(); // Debugging! 
}
else
{
    // Hosting
    service = new Service1{ServiceName="YourService"};
    ServiceBase.Run(new ServiceBase[] {service};);
}

それが役に立てば幸い、

乾杯、

スティアン

于 2014-08-04T07:35:45.040 に答える