2011-02-10 12 views
2

私はMVCについて少し勉強しようとしており、Ninjectを使用しているときに問題を見つけました。私はリポジトリをバインドしたいが、 'オブジェクト参照がオブジェクトのインスタンスに設定されていない'というエラーが発生し続ける。ASP MVC 2 Ninject

私は私のNinjectControllerFactory作成した

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    // A Ninject "kernel" is the thing that can supply object instances 
    private IKernel kernel = new StandardKernel(new SportsShopServices()); 

    // ASP .NET MVC calls this to get the controller for each request 
    protected override IController GetControllerInstance(RequestContext context, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController) kernel.Get(controllerType); 
    } 

    // Configure how abstract sevice types are mapped to concrete implementations 
    private class SportsShopServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductRepository>().To<SqlProductsRepository>() 
       .WithConstructorArgument("connectionString", 
       ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString); 
     } 
    } 
} 

と私のコントローラ:私は、DB接続文字列を提供するために、Web.configファイルを変更したとGlobal.asaxのは(のApplication_Startファイル

public class ProductsController : Controller 
{ 
    private IProductRepository productsRepository; 

    // Constructor used with Ninject 
    public ProductsController(IProductRepository _productsRepository) 
    { 
     this.productsRepository = _productsRepository; 
    } 

    public ViewResult List() 
    { 
     return View(productsRepository.Products.ToList()); 
    } 
} 

を)メソッドに含める:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 

私はexampl eをPRO ASP .NET MVC 2の本から削除しましたが、この作業を終わらせることはできません。

+0

に従っているあなたは、再構築しようとしましたか?また、あなたのソリューションに "SqlProductsRepository"クラスがありますか? – donhack

+0

ええ、再構築を試みました。 SqlProductsRepositoryはそこにあり、データベースから製品のテーブルを構築して返します。 – Apollo

答えて

3

あなたはちょうどアウトボックスninject機能が必要な場合は、独自のコントローラファクトリを作成することによって、あまりにも多く行っています。

あなたが必要とするすべては、Global.asaxの

public class MvcApplication : NinjectHttpApplication 
{  
    protected override IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
     { 
      new ServiceModule() 
     }; 

     return new StandardKernel(modules); 
    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 

    } 


    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 
     ); 

    } 

    internal class ServiceModule : NinjectModule 
    { 
     public override void Load() 
     { 
      // controllers 
      this.Bind<Controllers.AccountController>().ToSelf(); 
      this.Bind<Controllers.HomeController>().ToSelf(); 

      // Repository 
      Bind<Controllers.IFormsAuthentication>().To<Controllers.FormsAuthenticationService>(); 
      Bind<Controllers.IMembershipService>().To<Controllers.AccountMembershipService>(); 
     } 
    } 
} 
+0

これはまさに私がやったことです。私はCastle Windsorをコントローラー工場で使用しました(つまりSandersonの最初のバージョンの本書で規定されている方法)。これまでのことがうまくいっています。キャッスル/ファクトリーの方法に何か問題があるわけではありません。私はまったく異なる理由に切り替えました。 – Mayo

+0

お返事ありがとうございます。私は彼が本の中で示唆しているとおり、コントローラ工場を作りました。私はこれを行って、私がどのように乗っているかを知らせます。ありがとう。 – Apollo

+0

おかげで、魅力的な仕事をしました! – Apollo