2

初めてNinjectを設定しようとしています。私はIRepositoryインターフェイスとRepositoryの実装を持っています。私は、ASP.NET MVCを使用している、と私はそうのような実装を注入しようとしている:Ninjectは発砲しない?

public class HomeController : Controller 
{ 
    [Inject] public IRepository<BlogPost> _repo { get; set; } 

    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     var b = new BlogPost 
        { 
         Title = "My First Blog Post!", 
         PostedDate = DateTime.Now, 
         Content = "Some text" 
        }; 

     _repo.Insert(b); 

     return View(); 
    } 

    // ... etc 
} 

そして、ここでは、Global.asaxのだ:

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    protected override IKernel CreateKernel() 
    { 
     IKernel kernel = new StandardKernel(new BaseModule()); 
     return (kernel); 
    } 
} 

そして、ここではBaseModuleクラスです

public class BaseModule : StandardModule 
    { 
     public override void Load() 
     { 
      Bind<IRepository<BlogPost>>().To<Repository<BlogPost>>(); 
     } 
    } 

ただし、Index()アクションを参照すると、_repo.Insert(b)を使用しようとすると「オブジェクト参照がオブジェクトのインスタンスに設定されません」というメッセージが表示されます。私は何を外すのですか?

+1

あなたはNinjectのどのバージョンを使用していますか? –

+0

バージョン1.0を使用しています –

答えて

3

Ninject 1.0は、そのままの状態でMVCをサポートしていませんでした。 Web上にNinject 1.0を散在させてMVCを使用する方法はいろいろあります。

MVCサポートを含むNinjectトランクから最新のコードを取得することをお勧めします。次に、あなたのアプリケーションのための出発点として、以下を使用します。あなたのオリジナルの実装に対するハイライトするには、いくつかのものがあります

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using DemoApp.Models; 
using Ninject.Core; 
using Ninject.Framework.Mvc; 

namespace DemoApp 
{ 
    public class MvcApplication : NinjectHttpApplication 
    { 
     protected override void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default",            // Route name 
       "{controller}/{action}/{id}",       // URL with parameters 
       new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
      ); 
     } 

     protected override IKernel CreateKernel() 
     { 
      return new StandardKernel(new BaseModule(), new AutoControllerModule(Assembly.GetExecutingAssembly())); 
     } 
    } 
} 

...

  • Ninjectは 実装名 NinjectHttpApplicationを持っています - 1つは にあります。Ninject.Framework.Webと1つで Ninject.Framework.Mvc。あなたは のように表示され、後で使用することになります。 には、保護されたRegisterRoutes() メソッドが含まれています。
  • NinjectにControllerBuilderを使用して作成されたコントローラの作成を指示する方法が必要です。 Ninject.Framework.Mvc.NinjectHttpApplicationは、NinjectControllerFactoryを登録します。 Ninject 1.0を使用している場合は、自分で補給する必要があります。
  • コントローラをコンテナに登録する必要があります。手動で行うこともできますが、最新のコードを使用すると、自動的にコントローラーを登録するAutoControllerModuleが提供されます。あなたは、カーネルの作成時に指定したモジュールのリストにAutoControllerModuleを追加する必要が
+0

なぜControllerBuilderを使用してコントローラを登録する必要がありますか?私はそれらを(まだ)注入しようとはしていない。 –

+2

null参照例外は、コントローラに注入されていないため、_repoがnullになっています。 Ninjectがリポジトリをコントローラに注入するためには、Ninjectはコントローラを作成する必要があります。 Ninjectがコントローラを作成できるようにするには、リポジトリについて知っておく必要があるように、コントローラを登録する必要があります。最後に、Ninjectを使用してControllerBuilderが処理するコントローラを作成するように、MVCにプラグインする必要があります。 –

2

、下記のショー:

protected override IKernel CreateKernel() 
{ 
    IKernel kernel = new StandardKernel(
         new BaseModule(), 
         new AutoControllerModule(Assembly.GetExecutingAssembly()) 
        ); 
    return (kernel); 
} 

AutoControllerModuleはNinject 1におけるMVCサポートの一部です。バツ。 MVCコントローラクラスのコンストラクタに提供したアセンブリをスキャンし、それらを自動的にバインドします。コードでは、リポジトリを正しくバインドしていますが、Ninjectはコントローラのアクティブ化を担当していません。リポジトリをクラスのインスタンスに注入するには、Ninjectがコントローラの作成と起動を担当する必要があります。 AutoControllerModuleがなければ、MVCはコントローラの作成を担当します。したがって、Ninjectはメンバーを投入する機会を得ることはありません。 Ninjectがコントローラーの作成とアクティブ化を担当すると、予想どおりに注射が行われます。すべてのコントローラを発見し、このようなコードを生成するようAutoControllerModule

考える(にHomeControllerを例として使用):

Bind<HomeController>.ToSelf(); 
+0

助けてくれてありがとう、ジョンが最初に答えました。私はあなたに両方のクレジットを与えることができたらいいと思う:) –

+0

よろしくお願いします! –

関連する問題