2011-07-04 10 views
5

コンストラクタの注入パターンとルールDon’t call the container; it’ll call youの周りでちょっと混乱しています。コンストラクタインジェクション - どこから呼び出しますか?

実際のアプリケーションがコンストラクタインジェクションを使用してすべてのDIの利点を引き出す方法を誰かに教えてもらえますか?私はそのためにいくつかの簡単なを与えると私は一般的な例だと思う:

DomainObject 
RepositoryObject 
DaoObject 

関係は(私が思う)明白である - RepositoryObjectはDaoObject、domainObjectのリポジトリを必要とする必要があります。

コンストラクタインジェクションの使用私は、新しいキーワード(通常はドメイン)をいつ、どこで、どのように作成すればよいのですか?私はすべてのクラスの工場を書く必要がありますか?その工場のDIコンテナを参照する必要がありますか?

誰かが私にいくつかの実際のアプリケーションの例(Asp.Net MVC :)をしないでください)またはいくつかのプロジェクトの構造をスケッチするときは最高です。

+2

この回答を見る:http://stackoverflow.com/questions/6277771/what-is-a-composition-root-in-the-context-of-dependency-injection/6277806#6277806 –

+0

@Mark - Ok、私はそれを把握すると思うが、私はドメインオブジェクトの作成にいくつかの問題があります。私はコントローラーオブジェクト(アプリケーションのルートとしてGlobal.asax)を作成して、今私はいくつかのアクション(投稿)を持っていて、この時点で作成しなければならないと仮定して、新しいブックとブックに必要な依存性ofc(リポジトリーまたは何か) 。その新しいオブジェクトを作成する方法は?私は常にその依存関係をControllerオブジェクトに提供する必要がありますが、そのうちのいくつかは私の "ブック"オブジェクトを作成するためにのみ使用されますか?リポジトリと同じ状況があります(その一部のメソッドは新しいドメインオブジェクトを作成します)。 – mgibas

+1

http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-object/4836790#4836790 –

答えて

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()コードはありません。

+0

コンテナを使用する必要があります。つまり、MVCの統合が行われます。 http://code.google.com/p/autofac/wiki/Mvc3Integration –

+0

Thx、しかし、私はMVCでコントローラを作成する方法を知っていますが、残りのオブジェクト(主にドメイン)とは何ですか? – mgibas

+0

ドメインオブジェクト(ネストされたオブジェクト)は、構成に基づいてDIコンテナによって自動的に作成されます。 DIコンテナ(コードまたはいくつかの設定ファイルのいずれか)は、各コンストラクタ引数のインスタンスを生成するクラスを指定することによって構成する必要があります。私の例では、 'IFooService'型の引数を見るたびに' FooService'をインスタンス化するようにDIコンテナに指示します。コントローラを作成するときに、何を引数として渡すかを知っています。 –

1

答えとMark Seemannのリンクは十分ですが、何かを追加したいと思います。 DIへの初心者として(私は)、この質問は常にバグです。「いいですが、私の実際のオブジェクトがいつ、どのように呼び出されて注入されるのですか?」私が理解し、適用するのにはしばらく時間がかかりました。

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

例のキーポイント。

  • Global.asaxのは
  • CreateKernelメソッドを使用すると、カーネルを作成し、コンテナに
  • BasePageクラスをごdependecyマップを教えてこれはどこで上書きさ(Ninject.Web.dllである)NinjectHttpApplicationから継承されます。このwebformsのためのものなので、ページ内のインターフェースはすべてbasepageから派生していれば解決されます。

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

は、私はあなたが何のMVCやWeb言っ知っている?)しかし、ロジックは、アプリケーションの開始(主に自分のdepencenyマップを設定し、同じ

  • されていないWindowsの場合)
  • そのないウェブなしなしURLので、直接フォームを呼び出す場合は、この例のようにHow to use Ninject in a Windows Forms application?と呼びます。あなたがいくつかのパターンMVPまたはMVVMを使用しているかどうかは分かりませんが、これは開始点になる可能性があります。

これは役に立たないと思いますが、とにかく、これは役に立ちます。

関連する問題