3

しばらく前に同様の質問がありましたが、IoC / DIのトピック全体と、私が達成しようとしていたことについての理解がはるかに少ないので、ここでもう一度説明します。

社内で一般的に使用するライブラリを構築しています。パブリックAPIの最も一般的に使用される部分は、すでにIoCに対応していますが、下位レベルの領域では、まだかなりの新機能が進行中であり、これを削除したいと思います(ただし、現時点では、実際よりも正式な理由でより多く使用されています)必要性)。

これ自体は簡単に実行できますが、もちろん、ライブラリを使用するたびに、すべてのコンポーネントを再度配線する必要があります。これはほとんど常に同じように見えるので、私は通常、これらのデフォルトの登録をAutofacモジュールにラップして、それで完了します。

(質問1:このモジュールはメインライブラリアセンブリに含まれるのでしょうか、それともAutofacがライブラリで使用される唯一のIoCコンテナである可能性が高い場合でも、スタンドアロンパッケージである必要がありますか?)

問題は、私が現在、IoCの目的を実際に理解している、またはIoCコンテナがどのように使用されているかは言うまでもなく、IoCコンテナが何をするのかを知っている唯一の開発者であるということです。そして、他のすべての人にそれらを伝えるのは悪い考えです。 Autofacパッケージを使用するか、貧乏人のDIを使用して12以上のオブジェクトのグラフを手動で作成することができます。(私はみんなを知っています-私はとにかく私の多くの小さなクラスすべてに夢中なので、彼らはそれを放っておいて、彼らが必要なものを自分で構築するでしょう。)

これを解決するために私が考えたのは、一般的に必要なタイプ(Autofacモジュールによって配線されたものと同じように見える)の事前構成されたオブジェクトをプルするService Locatorのようなものを追加することです。おそらく、軽量のIoCコンテナーによって内部的に配線されます。 。

Service Locatorはアンチパターンであり、どのような問題が発生するかを知っています。これをオブジェクト構成の(私の)手段として使用することは決してありませんが、IoC/SOLID障害の「ショートカット」としては実行可能でしょうか。 ?他にどのようなオプションがありますか?その場合、ライブラリにAutofacモジュールを含めて、「サービスロケーター」をそのフロントエンドとして機能させることも意味がありますか?

4

1 に答える 1

4

フレームワークの場合、基幹業務アプリケーションの場合とは異なるルールが適用されます。私の意見では、これは依存性注入を適用する場合にも当てはまります。これは、 Microsoft Patterns&PracticesEnterpriseLibraryの設計を見るとわかります。。依存性注入パターンを中心に完全に設計されていますが、通常のユーザーはこれを知りません。工場を利用してユーザーの生活を楽にします。あなたの場合、他の開発者に依存性注入を使用するように強制するのは賢明ではありません。なぜなら、あなたは物事を難しくしているように見えることをしているので、おそらく彼らを苛立たせるだけであり、彼らはそれの利点を理解しないからです。これはおそらく彼らにDI全体に否定的な感情を与えるでしょう、そしてあなたは後で彼らにDIを紹介する可能性を失うでしょう(彼らはすでにそれを嫌うことを決心しているからです)。

このモジュールはメインライブラリアセンブリに含まれるのでしょうか、それともスタンドアロンパッケージであるのでしょうか。

アーキテクチャの観点からは、ライブラリがDIコンテナに依存することを望まないため、通常はこれをライブラリ自体に統合しません。ただし、エンタープライズライブラリを見ると、UnityDIフレームワークに大きく依存していることがわかります。別のコンテナーを使用するようにEntLibを変更できますが、EntLibは引き続きUnityを参照します。これにより、フレームワークの設計者は便利なファクトリメソッドをユーザーに提供でき、アプリケーションで何らかの「Framework.Bootstrap」メソッドを呼び出さなくてもフレームワークを使用できるようになります。

SOLIDの原則を念頭に置いてフレームワークを設計するために最善を尽くしてください。これは、単に最善の方法であることがわかっているからです。また、将来的にアプリケーションを設計するこの方法を紹介することもできます(そして、依存性注入に他の人が興味を持つかもしれません)。しかし、フレームワークデザイナーとして、ユーザーが誰であるかを考え、ユーザーに適したAPIを考え出す必要があります。たとえば、.NETのフレームワーク設計ガイドラインを念頭に置くと非常に役立ちます。

エンタープライズライブラリを見ると、ルート/メインタイプにファクトリがあることがわかります。他のすべては、隠れてあなたのために解決されます。これが進むべき道だと思います。特に通常の/単純なユースケースでは、ユーザーがすべてを自分で接続する必要があるAPIでユーザーを煩わせないでください。

于 2012-06-25T14:24:32.050 に答える