46

Mark Seemannが"Dependency Injection in .NET"を読んだ後、私は反パターンであるService Locatorから離れます。 the release notes on MVC 4を読めサービスロケータのアンチパターンを使用するMVC4はなぜですか?

私は、次を参照してください。

DependencyResolverによる制御(IOC)の改善された反転:Web APIを は今、さまざまな施設のインスタンスを取得するためにMVCの依存関係 リゾルバによって実装サービスロケータパターンを使用しています。

したがって、私は好奇心旺盛左とMicrosoftは、あなたが気にしないことを、実装の詳細だ2012年

答えて

50

でサービスロケータを使用する理由混乱しています。重要なことは、Web APIがDependencyResolverを使用してさまざまな施設の依存関係を解決するようになったため、これらの施設にプラグインするときはいつでも、実際の依存関係注入を使用できることです。だからあなたのコードであなたは本当の依存関係注入を使用します。 MicrosoftがDependencyResolverを使用しなかった場合、カスタム機能を実装したいときに依存関係を解決するために、コード内でサービスロケータのパターンとして使用していたはずです。これはあなたにとって悪いです。今のところはMicrosoftには悪いですが、あなたは気にしません。フレームワークを設計するフレームワークを使用してアプリケーションを設計すると同じではありませんので、Microsoftが2012年

でサービスロケータを使用する理由

したがって、私は好奇心と混乱して左にしています。 ASP.NET MVCのような再利用可能なフレームワークを設計する際に考慮すべき点がいくつかあります。いくつかの例は、このフレームワークを使用している人が、このフレームワークを使用してコード内の本に書かれているベストプラクティスを利用できるように、フレームワークを設計することです。

+9

+1フレームワークはアプリケーションとは異なるルールに従います。フレームワークコンテナに依存しない(フレームワークを使用したいアプリケーションがすでに別のコンテナを使用している場合)、通常はそれらのアプリケーションでDIの使用を強制したくない場合(DIを使用したくない場合まったく)。 –

+23

私は、それがフレームワークなのでサービス・ロケータが適切であるという議論を買わない。はい、フレームワークはアプリケーションとは異なりますが、サービスロケータを使用せずにフレームワークを作成することは完全に可能です。 ASP.NET MVC 1と2、またはWCFほど複雑なものを見てください。 ASP.NET MVC 3+のDependencyResolverの問題点は、内部実装の詳細だけでなく、パブリック 'DIサポート'として公開され宣伝されていることです。 –

+0

@ MarkSeemann大企業のフレームワークのチーフアーキテクトとこの議論がありました。このようなフレームワークコンテナにとらわれない方法を教えて、そのフレームワークを使って書かれたすべてのアプリケーションにDIパターンを適用しない方法を教えてもらえれば、私はそれらを聞いてうれしいです。 –

35

Darinが指摘しているように、ASP.NET MVC 4はFrameworkであり、コンテナには依存しません。そのため、サービスロケータはIDependencyResolverの形式で提供されます。これにより、誰もが選択したコンテナにプラグインすることができます。

しかし、私はこれをアンチパターンと呼んでいません。これにより、あなたが選択したコンテナを使用することができますが、サービスの場所を使用するアプリケーション開発者を強制しません。フレームワークが開発者にサービスロケーションを使用させた場合、私はそれをアンチパターンと呼んでいます。しかし、ASP.NET MVCアプリケーションを作成する開発者は、コンストラクタインジェクション、プロパティ設定、またはサービスロケーションを介してDIを自由に使用できます。彼らの選択です。

私またはASP.NET MVCチームによって発行された依存関係注入のすべてのASP.NET MVCの例を見てください。ほとんどすべての場合、コンストラクタインジェクションを使用しています。彼らはサービスの場所を使用していない。

実際、ASP.NET MVCソースコードのほとんどは、依存関係を取得するためにサービスロケーションを使用しません。 MVCが従来のAPIなどのサービスロケータを呼び出すいくつかの重要な場所があります。しかし、それはそれについてです。

+3

これは合理的だと思うが、私はMarcin Dobosz(http://blogs.msdn.com/b/marcinon/)からこの返答を受け取った理由は不明だが、Markの本/サービスロケータに関するメールを私に電子メールで送っている私はその本を読んでいないので、なぜそれが反パターンであるかという議論に慣れていません。なぜそれが悪いデザインだと思うかを明確にすることができますか? –

+3

明確にするために、私はMicrosoftの仕事を知っているMarcinに電子メールを送り、サービスロケータがアンチパターンと呼ばれているとは聞いたことがないことに驚いた(これはインターネット上で見つけやすい)バスではありますが、Mark S.が何を指しているのかは私が考えている例です。 –

+0

あなたはこう言っています。「私やASP.NET MVCチームが発行した依存関係注入のASP.NET MVCの例をすべて見てください。 あなたが提案するものへのリンクを提供できますか?私は、私のコントローラの多くが使用しているサービス参照をいくつか持っています。モデルオブジェクト(コンストラクタまたはメソッド)に提供されるオブジェクトを取得して、ビューに提供されるモデル(viewModelを作成する場合)を作成します。私の主な理由はIoCを実行したいのは私のテストプロジェクトです。私は実際にテストプロジェクトからサービスを呼び出すことなくServiceReferenceからIServiceを実装する何かを提供できるようにしたいと考えています。 – DaveH

関連する問題