17

問題:

クラスを想定します。

public class MyAwesomeClass
{
   private IDependCls _dependCls;
   public MyAwesomeClass(IDependCls dependCls)
   {
       _dependCls = dependCls;
   }

}

そして、別の場所で、次のようにそのクラスのインスタンスを取得する必要があります。

public class SomewhereElse
{
    public void AwesomeMethod()
    {
        //...
        // AwesomeStuff
        //...

        var GetErDone = new MyAwesomeClass();  // PROBLEM! No constructor with 0 arguements
    }
}

質問は、私ですか

提案された解決策 1:

A) 依存関係を解決する追加のコンストラクターを作成する必要がありますか? 例えば:

   public MyAwesomeClass() // new constructor
   {
       _dependCls = DependencyResolver.Current.GetService<IDependCls>();
   }


public class SomewhereElse
{
    public void AwesomeMethod()
    {
        var GetErDone = new MyAwesomeClass();  // IT WORKS!!
    }
}

提案された解決策 2:

AwesomeMethodB)直前に 内部でリゾルバーを使用するvar GetErDone

public class SomewhereElse
{
    public void AwesomeMethod()
    {
        var depCls = _dependCls = DependencyResolver.Current.GetService<IDependCls>();
        var GetErDone = new MyAwesomeClass(depCls);  // IT WORKS!!
    }
}

Autofac ソリューション?

C) 他の Autofac の方法はありますか?

ベスト プラクティスと、可能であれば優れた Autofac ソリューションを探しています。オプションの依存関係が多くの混乱につながる可能性があるため、最初の方法は最悪だと思います。

概要:

依存関係があるnew MyAwesomeClass()ときを取得するにはどうすればよいですか?MyAwesomeClass

4

6 に答える 6

11

構成ルートパターンを見てください。

その通りです。依存関係の解決を引き上げても、問題が別の場所に移動するだけです。ただし、オブジェクト グラフで上に移動し続けると、アプリケーションのエントリ ポイントに到達します。そこで、オブジェクト グラフを作成します。

これをService Locator アンチパターン(この場合はクライアント クラスで DependencyResolver を使用) と比較すると、Composition Root が優れたソリューションであることがわかります。

于 2012-05-29T14:13:04.390 に答える
1

まず、コンストラクター注入とは別に、プロパティ注入メソッド注入も使用できます。ただし、コンストラクター注入は最も一般的で最速の方法であるため、それに固執することをお勧めします。

MyAwesomeClass次に行う必要があるのは、依存関係と共に Autofac コンテナーに登録することです。ホームページにいくつかの良いがあります。

最後に、インスタンスをMyAwesomeClass直接作成しないでください。代わりに Autofac を使用してください。更新された例を次に示します。

public void AwesomeMethod()
{
    //...
    // AwesomeStuff
    //...

    var GetErDone = DependencyResolver.Current.GetService<MyAwesomeClass>();
}
于 2012-05-29T13:42:04.310 に答える
0

Autofac を介してインスタンスを自動的に解決する場合は、この中からのみ選択できます。

  • クラスのコンストラクターに挿入する
  • を使用して、プロパティに注入します

    var builder = new ContainerBuilder();

    builder.RegisterType<Foo>().PropertiesAutowired();

  • によるグローバル アクセスの使用DependencyResolver.Current.GetService<IFoo>();

于 2012-05-29T12:47:40.370 に答える
0

コンストラクターの依存関係としてMyAwesomeMethodtakeを含むクラス。MyAwesomeClassAutofac がインスタンス化を処理します。

于 2012-05-29T13:25:23.060 に答える