3

私は自分のソリューションにIoCを実装するためにオートファックを使用していますが、私はそれが正しいかどうかは疑いありません。このシナリオは次のとおりです。
ManagerクラスはすべてBaseManagerクラスから派生しています。 BaseManagerにはprotected User CurrentUserフィールドがあります。私がやろうとしているのは、CurrentUserをAutofacで解決することです。私はIUserProviderインターフェイスを作成し、いくつかのクラス(例えば、WebUserProviderWinformsUserProvider)を実装しました。 ?私はシングルトンまたはサービスロケータパターンを使用することができます)私は依存関係(私のクラスでアクセスcontainerを解決するにはどうすればよい正しい方法で依存注射を使用する

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>(); 
  • が、思わ:
    それから私は、例えば、Global.asax)に(次のように私のプロバイダを登録しましたそれはanti-patternだように。それでは、どのよう私は私の依存関係を解決する必要がありますか?

答えて

5

これは私には過剰性能のように聞こえる。なぜあなたは、ユーザの知識を持っているベースマネージャクラスを持っているでしょう?ハあなたが抽象化しすぎているので、少数のマネージャクラスはコードの匂いと保守の危険です。 本当にが必要ですか?

依存関係を解決するにはどうしたらいいですか?

あなたのコンテナにアクセスする方法を探してはいけません。コンテナを1か所で一度初期化する必要があります。すべての依存関係をコンストラクタ経由で注入する必要があります。これらの依存関係は、container.Resolve<T>を使用して依存グラフのルートから渡され、コンストラクタインジェクションを使用する依存関係グラフの他の場所(または一部の人はプロパティインジェクションを使用します)に渡されます。

+0

私はBaseManagerを定義し、そこにCurrentUserを初期化しなければなりませんでした。 (私はマネージャークラスのすべてのメソッドに現在のユーザーを渡したくなかった)あなたは「コンテナは一度に1つの場所で初期化する必要があります」と言ったので、サービスロケータとシングルトンが反パターンの場合、 1つのコンテナにアクセスできますか? – Kamyar

+2

これはWinFormsアプリケーションの場合は、エントリポイント(mainメソッド)の近くにコンテナを作成して設定することができます。メインでもインタフェースを解決してメンバーに渡します。 ASP.NETでは、global.asaxで設定し、工場を登録することができます。例えば、[here](http://stackoverflow.com/questions/5124393/setting-up-inversion-of-control-ioc -in-asp-net-mvc-with-castle-windsor)を使用します。したがって、DIとIoCでは、すべての依存クラスに抽象クラスが注入され、明示的に要求されることはありません。 – oleksii

関連する問題