2010-11-27 13 views
10

MVCのベースコントローラでは、以下の注入コードがあり、完全に動作していました。Ninject停止したMyプロパティの挿入

[Inject] 
private INavigationRepository navigationRepository { get; set; } 
[Inject] 
private ISessionService sessionService { get; set; } 

私は、ビルドエラーを得ることはありません、それはと死のイエローページでUPSを示し、「System.NullReferenceException:オブジェクトのインスタンスに設定されていないオブジェクト参照」 navigationRepositoryを参照するコードの最初の行を指します。

私はそれが機能していて、変更をバックアップしたにもかかわらず、まだエラーが発生しているので、コードの変更はごくわずかです。私は下のコードでそれを回避することができますが、私は注射を失う。どのようにこれに取り組む上の任意の考え?

private INavigationRepository navigationRepository; 
    private ISessionService sessionService; 
    public BaseController() 
    { 
     navigationRepository = new NavigationRepository(); 
     sessionService = new SessionService(new VolunteerRepository()); 
    } 

答えて

33

Ninjectはプライベートプロパティを注入できますが、有効にする必要があります。

new StandardKernel(new NinjectSettings() { InjectNonPublic = true }) 

しかし、プロパティーインジェクションを使用しない方がはるかに優れています。それを避ける方法がない場合にのみ使用してください。例えば。ある人によって麻痺が発生した場合(AttributeFilter)。それ以外の場合は、依存関係を意図せずに外部から設定することができ、IoCコンテナへの参照を与えるInject属性が必要になります。私はコンストラクタに依存関係を追加し、コンストラクタインジェクションを使用することをお勧めします。

+0

+1良い答え。ちなみに、最近、あなたと一緒にやってくれた素晴らしい作品に感謝します。 – StriplingWarrior

+0

2番目の@StriplingWarriorのコメント。また、これをDIについての最も重要なポイントの1つとして+1してください。 –

+2

私はプロップインジェクションを握っているうちにこれについて知りませんでしたが、インジェクションが必要なベースクラスに4つのものがあり、派生クラスにそれらを強制したくないのであれば、答えはあなたに欠けている概念があるということですクラス内にカプセル化されています - プロップインジェクションからリファクタリングするために使用します。 IOWプロパティの注入は、常に常に悪い考えです - あなたはそれから離れてrefacotr十分にahrdをしようとしていません。 "私の場合は違う - 私はPIの存在を正当化する惑星に特別な場合がある" –

1

プロパティをpublicに変更しました。私はそれが私的だと思う、Ninjectはそれを設定することはできません。

[Inject] 
public INavigationRepository navigationRepository { get; set; } 
[Inject] 
public ISessionService sessionService { get; set; } 
+3

これをあなたの質問の編集または回答のコメントとして追加できますか?そして、右に見えるようにCtrlキーで4でインデントすることを忘れないでください –

関連する問題