0

NinjectDependencyResolverコントローラーに依存関係を注入するのに最適なクラスを作成しました。依存関係を連鎖できることは理解していますが、私の問題は、コントローラーでクラスをインスタンス化し、それが別のクラスをインスタンス化することです。その 3 番目のクラスには、次のような別の依存関係が注入される必要があります。

public class MyController : Controller {
    MyObject obj;
    public MyController(IMyFirstDependency dependency) {
        obj = new MyObject(dependency);
    }
}

class MyObject {
    MyOtherObject otherObj;
    public MyObject(IMyFirstDependency dependency) {
        otherObj = new MyOtherObject(??????);
    }
}

class MyOtherObject {
    public MyOtherObject(IMySecondDependency dependencyTwo)
    {
        // do something with dependencyTwo
    }
}

dependencyTwoを注入する最良の方法は何ですか? MyObjectチェーン機能を使用できるようにコンストラクターに含める必要がありますか、それとも別の方法がありますか?

4

1 に答える 1

3

MyObjectこの他の依存関係を取ることができます:

class MyObject {
    MyOtherObject otherObj;
    public MyObject(IMyFirstDependency dependency, IMySecondDependency dependencyTwo) {
        otherObj = new MyOtherObject(dependencyTwo);
    }
}

必要なのは、カーネル内でこの依存関係を登録することだけです。

kernel.Bind<IMySecondDependency>().To<MyConcreteSecondDependency >();

ただし、通常は、これら 2 つのラッパー オブジェクトを必要とせず、コンストラクター (MyObjectおよびMyOtherObject) で手動でインスタンス化を行う必要はありません。コントローラーのインターフェイスを直接操作できます。それらのオブジェクトのポイントがまったくわかりません。それらがリポジトリを集約するいくつかのサービス クラスとして機能する必要がある場合は、それらの周りに抽象化を定義し、コントローラーに直接このサービス クラスを取得させます。

public class MyController : Controller {

    private readonly IMyService myService;
    public MyController(IMyService myService) {
        this.myService = myService;
    }

    public ActionResult Index() {
        // you could use your service layer here with this.myService
    }

}
于 2013-02-03T17:28:22.913 に答える