2012-03-12 18 views
0

をよNinjectコンストラクタ・インジェクションとprobleを構築するには、MVCコントローラクラスから継承

public class BaseController : Controller 
{ 

    private ITenantRepository _repository; 
    [Inject] 
    public BaseController(ITenantRepository repository) 
    { 
     _repository = repository; 
    } 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
    } 
} 

明確に私が行方不明です0引数

を取るコンストラクタが含まれていません

BaseController」を構築することはできません何か明白です。あなたの子供のコントローラで

+0

Ctrl + Alt + Oはありません、あなたは '新しいBaseControllerを()'やっている場所を確認し、モック/スタブを渡しに行きます。しかし、最も重要なのは、そこにある50の洞窟のうちの1つを見て、試行錯誤して自分自身を保存してください。 (またはmanning.com/seemannとflounderを買うよりもずっと少ない)。 [Inject]は何も起こらないことに注意してください(実際にはそれは十分です)。 'DependencyResolver'はASP.NET MVCのパイプラインにフックする必要があります。 https://github.com/ninject/ninject.web.mvc/wiki/MVC3のNuGet Ninject.MVC3パッケージと関連ドキュメントを参照してください。 –

答えて

2

はあなたの基底クラスと同じパラメータでコンストラクタを定義していることを確認してください:

public class FooController: BaseController 
{ 
    public FooController(ITenantRepository repository): base(repository) 
    { 
    } 

    ... 
} 

あなたは、基本クラスで使用すると、パラメータなしのコンストラクタを取り外して交換しているので、これを実行する必要がありますそれはカスタム1つで。そのため、派生クラスもパラメータのないコンストラクタから削除する必要があります。

また、ASP.NET MVCでNinjectを使用する通常の方法は、アプリケーションの最上位にDependencyResolverとして設定することです。コントローラは、使用している依存性注入コンテナにコードを結びつけるために使用した[Inject]属性のようなコンテナ固有の属性を使用しないでください。

注意だけでなく、前の観点から悪い習慣であることに加えて、あなたのコード内のコンストラクタの[Inject]属性が重大な影響を与えないこと:

  • 何も、中のステップと見て」言うつもりはありませんあなたがNinjectがDependencyResolverとして設定されていない場合は一切あいまいさがありませんように、それは何があるのコントローラ
    • を構築するために必要なものへと属性を必要としないではないでしょう私たちはより良い、その依存関係
    • を提供し、属性を持っていますデフォルトのconstr uctor
    • 全く競合コンストラクタ
+0

[あなたがよく知っているように] Inject属性は、コンストラクタの選択をあいまいにすること以外は、あなたがそれを置く方法は、それが実際に何かをするかもしれないということを知らない人に示唆します(DependencyResolverの代わりに「 –

+0

@RubenBartelink」と言うことで、これを反映するように自分の投稿を更新しました。) –

+0

私のコメントを拡大し、 Dが言った。申し訳ありませんが、その怒りが今長く巻き込まれた場合。 –

関連する問題