0

私の質問は、Windsorが提供するWCFと型付きの工場施設に関するものです。私はIoCコンテナの概念、特に機能にまったく慣れていませんが、しばらく前に書いたプロジェクトを評価した後、それを調べ始めました。プログラムはn層であり、依存性注入がどこにでも実装されていないため、ユニットのテストはあまりできません。問題は、n層であるため、適切なDIを実行すると、5層下のように使用されるインスタンスの作成を最上位層が担当することになります。そこで私はIoCに目を向けました。

しかし、多くのSO記事や他のサイトを読んだ後、私は今、いくつかの問題に悩まされています。最初の主な問題の1つは、クラスをWCFサービスの物理的な実装から切り離すことでしたが、私はそれを次のように行いました。

service = ManagerService.IoC.Resolve<IGridSubmitWorkService>(new { binding = new BasicHttpBinding(), remoteAddress = new EndpointAddress(WorkerAddress) });

result = service.SubmitWorkUnit(out errorString, aWorkUnit);
ManagerService.IoC.Release(service);

ただし、使用IoC.Resolve<>()すべきではなく、工場やWCF機能を使用して依存関係を排除する必要があること、IoC containerおよび一部の人々がアンチパターンと見なすサービスロケーターパターンであるということについて、複数の言及がありました。

私の問題はこれです:上記の3行のコードはほとんどすべての問題を解決しますが、適切なパターンに従うには、代わりにWCFファシリティ(型付きファクトリ)を作成する必要があります(このコードが使用されるクラスのインスタンスの提供を処理します) )とファクトリ用の新しいインターフェイス。これは、パターンを満足させるためだけに、過剰なエンジニアリングを行い、コードに不要な複雑さを追加しているように感じます。

質問1:私がここで見逃している基本的なものはありますか?

質問2:コードからわかるように、私はWebサービスの空でないコンストラクターを呼び出しています。WCF機能を実装した場合でも、これは簡単ですか?

質問3: Windsor wikiの説明は非常に簡潔で、あまり役に立たないことがわかったので、WCF機能の使用に関する適切なチュートリアルを教えていただけますか?

ありがとう

4

1 に答える 1

1

Q1。はい、見逃している重要なことがあると思います。3行の例では、1つの実装依存関係(GridSubmitWorkService)が別の依存関係(ManagerService.IoC)に置き換えられています。説明のために、次のようにしてさらに簡単にしてみませんか?

service = new GridSubmitWorkService(binding,remoteAddress);
result = service.SubmitWorkUnit();

これもさらに簡単ですが、実装に依存関係があります。重要なのは、コンストラクターとプロパティインジェクションを使用すると、配管がどのように行われるかを理解する必要のないクリーンなコンポーネントを作成できるということです。あなたのコードと私のコードの両方で、その原則に違反しています-コンポーネントは独自の配管を管理しており、大規模なアプリケーションでは、それは非常に苦痛になり、非常に迅速になります。これが、ServiceLocatorがアンチパターンであると多くの人に考えられている理由です。

サービスロケーター自体の名前がゲームに影響を与えます。これはIoCと呼ばれます-制御の反転の略語です。しかし、これら2ビットのコードの構造を見ると、何も反転されていないことがはっきりとわかります。どちらの場合も、コードはほとんど同じことを行っていますが、例はもう少し抽象的で複雑です。

また、IoCを提供している人は誰もあなたにパターンに固執することを強制しようとはしていません。メリットが見当たらない場合、またはアプリにメリットがない場合は、パターンを使用しないでください。

Q2。適切なDIコンテナは、コンストラクタインジェクションに基づいています。Windsor WCF機能の使用は非常に簡単で、さまざまなホスティングメソッドをサポートしているため、バインディングやアドレスなどはとにかく適切に処理されます。

Q3。Windsorのドキュメントやウィキに加えて、stackoverflow.comには、フォーラムから質問まで、さまざまな情報があります。解決できないことがある場合は、具体的な質問をすることをお勧めします。

于 2012-07-03T22:12:07.067 に答える