2

依存関係が注入されたクラスがあるとしましょう:

public class SomeBusinessCaller {
   ILogger logger;
   public SomeBusinessCaller(ILogger logger) {
       this.logger = logger;
   }
}

私の質問は、そのクラスのオブジェクトをどのようにインスタンス化するのですか? AppLogger と呼ばれるこれの実装があるとしましょう。私が言った後

ObjectFactory.For<ILogger>().Use<AppLogger>();

SomeBusinessCaller のコンストラクターを呼び出すにはどうすればよいですか? 私は呼んでいますか

SomeBusinessCaller caller = ObjectFactory.GetInstance<SomeBusinessCaller>();

またはそのための別の戦略がありますか?

4

2 に答える 2

2

使用する DI コンテナーに応じて、yes : コンテナーに のインスタンスを提供するように依頼しますSomeBusinessCaller

コンテナーは自動配線を使用して、 SomeBusinessCaller が のインスタンスを必要とすることを自動的に判断する必要がありますILoggerAppLoggerが登録されているため、その要件を満たすことができます。

ただし、DI コンテナーを静的な Service Locator として使用しないでください。

代わりに、アプリケーションのコンポジション ルートで、依存関係グラフ全体を DI コンテナーに一度に作成させる必要があります。

于 2010-03-24T14:33:11.930 に答える
1

を使用するコードは、孤立してcallerいません。自分自身のインスタンスを作成する必要があると想定する代わりにSomeBusinessCaller、単純に依存関係を宣言します。

public class SomeOtherClass
{
    public SomeOtherClass(SomeBusinessCaller caller)
    {
        // ...
    }
}

コンテナは がSomeBusinessCaller必要であることを認識しILogger、自動的に のインスタンスを提供しますAppLogger

そして、何かがそのクラスのインスタンスを必要とする場合:

public class YetAnotherClass
{
    public YetAnotherClass(SomeOtherClass other)
    {
        // ...
    }
}

作成するすべてのオブジェクトに対してそのロジックに従うと、最終的には、実際にインスタンスを要求するオブジェクトが 1 つだけになります。

public static void Main()
{
    // ...Initialize ObjectFactory...

    var compositionRootObject = ObjectFactory.GetInstance<YetAnotherClass>();

    compositionRootObject.DoYourThing();
}
于 2010-03-24T16:22:03.893 に答える