5

コンストラクター インジェクションのパターンとルールについて少し混乱しています。コンテナーを呼び出さないでください。それはあなたに電話します

コンストラクター インジェクションを使用して、実際のアプリケーションがすべての DI の利点を引き出す方法を誰かが私 (そしておそらく他の誰か) に説明できますか? 私はそのいくつかの簡単な例を挙げますが、一般的な例だと思います:

DomainObject
RepositoryObject
DaoObject

関係は明白です (私は思います) - RepositoryObject には DaoObject が必要です。DomainObject には Repository が必要です。

コンストラクター インジェクションの使用 NEW キーワードについて (ほとんどの場合) 忘れることができると思いますが、いつ、どこで、どのように新しいオブジェクト (主にドメイン) を作成する必要がありますか? すべてのクラスのファクトリを作成する必要がありますか? その工場でDIコンテナを参照する必要がありますか?

誰かが実際のアプリの例を見せてくれたり(Asp.Net MVCではないでください:))、プロジェクト構造をスケッチしたりするのが最善です。

4

2 に答える 2

1

私はあなたのクラスの関係を理解し​​ていないので、ここにもっと明白な ;-) 例があります:

class FooService
{
    IFooRepository FooRepository { get; set; }

    public Service(IFooRepository fooRepository)
    {
        this.FooRepository = fooRepository;
    }
}

class Controller
{
    IFooService FooService { get; set; }
    IBarService BarService { get; set; }

    public Controller(IFooService fooService, IBarService barService)
    {
        this.FooService = fooService;
        this.BarService = barService;
    }
}

あなたがすでに言ったように、どこにnew FooRepository()new FooService()コードはありません。

于 2011-07-04T18:23:25.470 に答える
1

回答と Mark Seemann のリンクで十分ですが、何かを追加したいと思います。DI の初心者 (私はそうです) として、この質問は常に私を悩ませます。理解して適用するのにしばらく時間がかかりました。

回答とリンクをたどると、それがわかります。Web アプリケーションの Global.asax ファイルにインターフェイスとクラスを登録する必要があります。たとえば、Ninject を使用している場合は、nuget に移動して Ninject.Web (Web フォーム用) をダウンロードし、この例のように適用しますhttp://azolotar.blog.com/2010/06/22/ninject-2-0-インウェブフォーム/

例のキーポイント。

  • Global.asax は NinjectHttpApplication (Ninject.Web.dll にあります) から継承されます。
  • CreateKernel メソッドはオーバーライドされます。ここでカーネルを作成し、依存マップをコンテナーに伝えます。
  • BasePage : これは Web フォーム用であるため、ページがすべて basepage から派生している場合、ページのインターフェイスは解決されます。

これを追加する必要があります。BasePage の実​​装は非常に簡単です (ここにgithubのコードがあります)。おそらく既にベースページがあるので、この行を追加します KernelContainer.Inject(this); ベースページの OnInit に追加すると、問題を解決できます。最後の残りの 1 つとして、ascx で何かを使用する場合は、コンテナーが依存関係を解決できるように、ascx の OnInit をオーバーライドする必要があります。

私はあなたがMVCやウェブを言わないことを知っています:)しかし、ロジックは同じです

  • アプリケーションの開始時に依存マップを設定します ( Windows の場合は Main? )。
  • Web、URL、直接呼び出しフォームではないため、Windows フォームアプリケーションで Ninject を使用する方法は? この例のように。いくつかのパターン MVP または MVVM を使用しているかどうかはわかりませんが、これは出発点になる可能性があります

くそー、これは役に立たない答えに聞こえますが、とにかく、これが役に立てば幸いです。

于 2011-07-04T18:53:19.787 に答える