では、コードを企業全体に適用したいと考えています。これを行うには、2 つの基本的な問題について話し合う必要があるため、そのように答えを構成します。
- WCF とは何かを理解する必要があります。
- 依存関係を正しく管理する必要があります。
WCF とは
WCF は、RPC/RMI (リモート プロシージャ コール/リモート メソッド呼び出し) を実行する方法です。これは、一部のクライアント コードが、ネットワークを介して別の場所にあるコードを呼び出すことができることを意味します。
呼び出し可能な WCF サービスは、ABC トリプレットによって決定されます。
- サービス仕様は、「ServiceContract」属性を持つ .NET インターフェイスとして実装されます。これは契約です ("C")
- サービスの「場所」は、アドレス (「A」) とバインディング (「B」) のペアによって決定されます。Binding は、クライアントとサーバー間の通信に使用されるプロトコル スイート (NetPipe、TCP、HTTP など) を決定します。アドレスは、バインディングによって決定されるスキームに従う URI です (「net.pipe」、「net.tcp」、「http」、...)
クライアント コードが特定のアドレスで WCF サービスを呼び出し、特定のバインディングと特定のコントラクト (特定のアドレスのサーバーと特定のバインディングが配信するものと一致する必要があります) を使用すると、WCF は次のインターフェイスを実装するプロキシ オブジェクトを生成します。その契約。
サービスを提供するプログラムは、任意の .NET 実行可能ファイルです。サービス コントラクトを実装するオブジェクトまたはクラスを登録し、配信された各サービスを特定のアドレスとバインドに関連付ける、1 つまたは複数の WCF ホストを生成する必要があります。(おそらくその多く)
構成は、app .config ファイルを介して行うことができます。このファイルでは、ABC トリプレットを指定し、これらのトリプレットをアプリケーションで使用する名前に関連付けます。プログラムで行うこともできますが、これは非常に簡単です。
WCF は、アプリケーションのデプロイの問題、またはアドレスとバインドの構成の問題には対処しません。厳密に型指定されたオブジェクトを使用して (特定のインターフェイスを介して) 2 つの実行可能ファイルが相互に通信できるようにするという問題に対処するだけです。サービス構成の共有はあなた次第です。Windows 共有で共有 .config ファイルを使用するか、サービス (つまり A と B) を見つけるために必要なすべてのデータを配信する LDAP サーバーをセットアップすることもできます。
依存関係を正しく管理する
あなたのシナリオでは、WCF インフラストラクチャを使用する 3 つのアクターがいます。
- クライアントとなる SQLCLR アセンブリ。
- 別のクライアントとなるイントラネット サイト。
- サーバーになるサービスホスト。
アセンブリの最小数は 4 です。前述のアクターごとに 1 つと、3 つのアクターすべてが使用するコントラクトを指定する 1 つです。次のものが含まれている必要があります。
- コントラクトを指定するインターフェース。
- インターフェイスに必要なすべての型。もちろんネットワーク経由で送信されるため、シリアライズ可能である必要があります。
それ以上何もないはずです。さもないと、メンテナンスの悪夢になります。
ご質問への回答
私の答えが明確であることを願っています。ご質問への回答をまとめましょう。
WCF サービスは私が望むソリューションですか? 潜在的なサービス クライアントはすべて同じサーバー上で実行されます。CLR アセンブリ プロジェクトと Web サイト プロジェクトの両方で同じコード ベースを参照する別の方法はありますか? さまざまなプラットフォーム (Java など) のサポートは必要ありません。
すべてがやり過ぎです。WCF はかなり使いやすく、スケールダウンも非常に優れています。
WCF サービスのコードをクラス ライブラリのように使用できますか? または、サービスからクラス/メソッドにアクセスするための新しい方法をプログラムする必要がありますか?
既存のコードで WCF を設定するには、追加のクラスの実装と、前述のクラスを提供するホストを作成するコードのみが必要です。
WCF サービスを呼び出すには、インターフェイスを実装する .NET (プロキシ) オブジェクトである Channel を作成する必要があります。
したがって、基本的に、ビジネス コードは同じ状態のままです。
開発、テスト、および本番インスタンスの分離?
WCF はそれを処理しません。異なる環境、異なるサービス アドレス。これは自分で処理する必要があります。
クライアントがアクセスしている間に WCF サービスを更新できますか? または、メンテナンス ウィンドウをスケジュールする必要がありますか?
これは、メンテナンス ポリシーによって異なります。サービス提供プロセスを強制終了し、新しいバージョンを起動するのが基本的なアップグレード メカニズムです。
サービスを更新する場合、何らかの方法でクライアントも更新する必要がありますか?
前のセクションで説明したように、依存関係を正しく管理していれば、サービス仕様 (インターフェース) が変更された場合にのみクライアントを更新する必要があります。
StageConfig = dev、test、prod のいずれかに応じて、現在データベース接続文字列を動的に設定しているように、サービス参照を動的に設定できますか?
おそらくプログラムでサービスの Address と Binding を設定することによって、それを管理する必要があります。
私の CLR アセンブリは .Net 3.5 用に作成されていますが、.NET 4.0 用の Web サイトは問題を引き起こしますか?
前のセクションで説明したように、依存関係を正しく管理していれば、唯一の制約は、"コントラクト" アセンブリに必要な CLR の最小バージョンになります。
これを達成するために知っておく必要がある .NET サービス アーキテクチャ プログラミングの最小セットは何ですか? WCF については時間をかけて学習しますが、アーキテクチャの取り組みを評価し、物事を成し遂げる (機能要求) と比較検討する必要があります。MS チュートリアルは、希望するスキルを習得できますか?
これらの演習の結果が必要になります。
- 別の DLL にある WCF コントラクトを介して通信する 2 つの実行可能ファイル (クライアントとサーバー) を作成します。構成は、アプリの .config ファイルに配置する必要があります。
- 別の DLL にある WCF コントラクトを介して通信する 2 つの実行可能ファイル (クライアントとサーバー) を作成します。構成は、プログラムで決定する必要があります。
- シリアル化可能なクラスをパラメーターとしてサービスに送信してみてください。
- サービスの戻り値としてシリアル化可能なクラスを送信してみてください。
その後、サービスのアドレスとバインディングを共有するための最良/最も安価な方法を考える必要があります。
それが役に立てば幸い。