7

依存性注入用NuGetパッケージを使用してインストールされたASP.Net MVC3アプリケーションにNinject MVC3(バージョン3.0.0.0)を使用しています。ここでAsp.Net MVC3またはMVC4でのNinject依存性注入

は、Global.asaxの変化である:

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("favicon.ico"); 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

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


    protected override IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
     RegisterServices(kernel); 
     return kernel; 
    } 

    protected override void OnApplicationStarted() 
    { 
     base.OnApplicationStarted(); 

     AreaRegistration.RegisterAllAreas(); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IUserRepository>().To<UserRepository>(); 
     kernel.Bind<IUserService>().To<UserService>(); 
     kernel.Bind<ICommonRepository>().To<CommonRepository>(); 
     kernel.Bind<ICommonService>().To<CommonService>(); 
    } 
} 

しかし、私は私にHomeControllerのためのパラメータなしのコンストラクタを持っているけれども、それは次のエラーを与える:

System.NullReferenceException: Object reference not set to an instance of an object. 

Generated: Wed, 28 Mar 2012 05:49:01 GMT 

System.InvalidOperationException: An error occurred when trying to create a controller of type 'MVC3.Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at Ninject.Planning.Bindings.BindingConfiguration.GetProvider(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\BindingConfiguration.cs:line 107 
    at Ninject.Planning.Bindings.Binding.GetProvider(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\Binding.cs:line 212 
    at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
    at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
    at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
    at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
    at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
    at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
    at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
    at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
    at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
    at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
    at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
    at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
    at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
    at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
    at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56 
    at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) 
    --- End of inner exception stack trace --- 
    at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) 
    at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 
    at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
    at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2() 
    at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() 
    at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) 
    at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 
    at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

UPDATE:

以下はHomeControllerのコードです:

public class HomeController : Controller 
    { 
     #region Declaration 
     public ICommonService _commonService { get; set; } 
     #endregion 

     #region Constructor 

     public HomeController() 
     { 

     } 

     public HomeController(ICommonService commonService) 
     { 
      this._commonService = commonService; 
     } 
     #endregion 

     public ActionResult Index() 
     { 
      return View(); 
     } 

コンストラクタCommonServiceとCommonRepositoryの:

public class CommonService : ICommonService 
    { 
     #region Declaration 
     private readonly ICommonRepository _repository; 
     #endregion 

     #region Constructor 
     public CommonService(ICommonRepository repository) 
     { 
      this._repository = repository; 
     } 
     #endregion 

public class CommonRepository : ICommonRepository 
    { 
     #region Declaration 
     private DBContainer _context = new DBContainer(); 
     #endregion 

     #region Constructor 
     public CommonRepository() 
     { 

     } 
     #endregion 

は、私はここで他の参考足りませんか?

+0

パラメータのないコンストラクタがpublicであることを確認してください – Bond

+0

ボンド、はい私はそれを公開しています。 public HomeController() { } – Prasad

+0

問題のコントローラを共有できますか(アクション方法なし)? – tpeczek

答えて

7

これはNinjectでコンストラクタの選択がどのように動作するかです:

  1. コンストラクタは[ジェクト]属性を持っている場合、それが使用されています。複数のコンストラクタに[Inject]属性がある場合、NinjectはNotSupportedExceptionをスローします。
  2. [Inject]属性を持つコンストラクタがない場合、Ninjectは、Ninjectが解決する方法を理解する最も多くのパラメータを持つものを選択します。
  3. コンストラクタが定義されていない場合、Ninjectはデフォルトの パラメータのないコンストラクタを選択します。

NinjectはICommonServiceを解決する方法を知っていると考えているため、おそらくパラメータのないコンストラクタを選択していない可能性があります。 Ninjectで使用する場合や、ICommonServiceが解決されない理由をさらに調査する場合は、パラメータのないコンストラクタを[Inject]属性で修飾してください。 https://github.com/ninject/ninject/wiki/Injection-Patternsから

+0

私は[インジェクション]属性をパラメータのないコンストラクタで使用するとうまくいきますが、ICommonServiceは解決されません。 – Prasad

+0

問題はNinjectがICommonServiceを構築できないことです。 RegisterServicesメソッド(Global.asax)でバインドされていません。最善のケースでは、Ninjectは暗黙の自己バインディングを使用していますが、構築できるものは何も与えません。このサービスの正確なタイプは、解決すべきものとは何ですか? – tpeczek

+0

私は自分のGlobal.asaxのRegisterServicesにICommonServiceを追加しようとしましたが、まだ解決されず、ちょうど私の質問が更新されていません。 – Prasad

1

引用:

プライマリDIパターンがコンストラクタ注射です。あるタイプのインスタンスを起動するとき、Ninjectは次のルールを順番に適用することで、タイプのコンストラクタの1つを選択します: -

コンストラクタに[Inject]属性がある場合は使用されますNinjectは検出時に実行時にNotSupportedExceptionをスローします)。

[Inject]属性を持つコンストラクタがない場合、Ninjectは、Ninjectが解決する方法を理解する最も多くのパラメータを持つものを選択します。

コンストラクタが定義されていない場合、Ninjectはデフォルトのパラメータなしコンストラクタを選択します(あると仮定します)。

+0

パラメータレスコンストラクタを削除すると、「コントローラにパラメータのないpublicコンストラクタがあることを確認する」エラーが発生する – Prasad

2

最近MVCアプリケーションを.NET 4.0から4.5にリターゲットした場合、まったく同じ現象が発生します。ターゲットの正しい.NETバージョンのDLLを参照することで修正されています。

Ninject、Ninject.MVC3、Ninject.Web.Commonナゲットを使用している場合は、そこにすべての.NETターゲットがあります。

+0

ありがとう!これで私の問題が分類されました。 –