2011-02-02 5 views
11

私はMVC 2とNinjectでELMAHを使用しようとしています。パラメータのないコンストラクタを使用する必要があります。 Using a parameterless controller constructor with Ninject?コンストラクタインジェクションの代わりにプロパティインジェクションを使用する

コンストラクタインジェクションの代わりにプロパティインジェクションを使用することをお勧めしました。私はDepartmentsRepositoryまたは_departmentsRepositoryにアクセスしようとするかどうかを

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
     get { return _departmentsRepository; } 
     set { _departmentsRepository = value; } 
    } 

    ... 
} 

しかし、私の他のコントローラ機能で

が、私はインスタンスに設定されていない オブジェクト参照を取得:これに

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

    public DepartmentsController(IDepartmentsRepository departmentsRepository) 
    { 
     this.departmentsRepository = departmentsRepository; 
    } 

    ... 
} 

:だから私はこのから移動しましたアクセスしようとするとオブジェクトのエラーが発生します。

私はここで何かする必要がありますか?

+6

あなたは 'Ninject.Web.Mvc'を使用していますか? –

+2

何を待ちますか?パラメータのないコンストラクタを使用する必要があるのは何ですか? – jfar

+0

プロパティに特定の名前がある場合、特定の依存関係が解決されないという奇妙な問題が発生しています。名前が変更されても正常に動作しますが、他のすべての依存関係は通常どおりに解決されます(同じプロパティ名の場合は、同じ依存関係がうまく解決されます)。私は理由を知りませんが、いつも試してみることです。 –

答えて

2

オブジェクト参照の例外が設定されていない理由は2つあります。

DepartmentsRepositoryの具体的な実装にIDepartmentsRepositoryをバインドする方法を知りません(私はそれはしかし場合)である疑い

1)Ninject

2)あなたは、コントローラのコンストラクタでDepartmentsRepositoryプロパティにアクセスしようとしている場合、それは意志例外をスローします(Ninjectはオブジェクトが構築された後でProperty Dependenciesを挿入することしかできません)。

希望に役立ちます。

10

私にも同様の問題がありました。私の質問を見てください:Using Ninject with Membership.Provider。あなたがDepartmentsControllerを初期化するとき

は、基本的にはあなたのNinjectカーネルにthis(つまり、あなたの部署コントローラを注入する必要があるので、のようなその何か:。。

NinjectHelper、この場合には、現在のNinjectカーネルを取得し
public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
    get { return _departmentsRepository; } 
    set { _departmentsRepository = value; } 
    } 

    public DepartmentsController() 
    { 
    NinjectHelper.Kernel.Inject(this); 
    } 
} 

+6

これは動作しますが、コントローラがNinjectについて知る必要がないように、ControllerFactoryを使用して注入するのが良い考えです。 –

3

Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 

このような何かを試してみてくださいダニエルT.として

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
+0

これはどのようにしてこの質問に答えるのですか? –

+1

@daveこれは、彼の 'オブジェクトのインスタンスに設定されていないオブジェクト参照'の問題を解決することができます... Ninject.Web.Mvcについては、私はそれを試していない。 – frennky

0

投稿上記のコメントでは、あなたはNinject.Web.Mvcをチェックアウトする必要があります。そのプロジェクトでNinjectHttpApplicationを使用すると、すべてのものが自動配線されるので、NinjectControllerFactoryが新しいコントローラーを構築するときに、Inject()を呼び出してプロパティー注入を行います。

関連する問題