2012-09-07 25 views
36

UPDATE用に定義されていませんパラメータなしのコンストラクタ - 私たちは始める前に、私は、この問題ASP.NET MVC 4 + Ninject MVC 3 =このオブジェクト

に対する解決策のリンクや説明のための私の答えをご覧ください。これは非常によくある質問で、問題なしで多くの月にNinjectを使用していたことは分かっていますが、今はそれが出てきています。また、いいえ、GoogleとSOの結果のどれも今まで私を助けませんでした。

ので、のWindows Server 2008 R2上のVisual Studio 2012から非常に、非常に、非常に単純なプロトタイプASP.NET MVC 4プロジェクトで実行されている次のコードビットを考慮してください。

public class DefaultController : Controller { 
    private IGroupPrincipalRepository GroupPrincipalRepository { get; set; } 

    [Inject] 
    public DefaultController(
     IGroupPrincipalRepository groupPrincipalRepository) { 
     this.GroupPrincipalRepository = groupPrincipalRepository; 
    } 
} 

そして、ここではNinjectWebCommon.cs RegisterServicesです方法:

kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
    c => 
     new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "?", "?", "?", "?"))).InSingletonScope(); 

、これはNinjectを使用する(ただし、.NET 4にASP.NET MVC 3です)私の他のプロジェクトは、私の知る限り、これはすべての仕事をするために必要なものである知っているように動作し、どのようにです。だから、なぜ私は突然取得しますかこのオブジェクトに対して定義されたパラメータのないコンストラクタはありません。例外?

UPDATE

ここでフルNinjectWebCommon.csファイルがあります:

[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(App_Start.NinjectWebCommon), "Stop")] 

namespace App_Start { 
    using System; 
    using System.DirectoryServices.AccountManagement; 
    using System.Repositories.ActiveDirectory; 
    using System.Web; 
    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 
    using Ninject; 
    using Ninject.Web.Common; 

    public static class NinjectWebCommon { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     public static void Start() { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     public static void Stop() { 
      bootstrapper.ShutDown(); 
     } 

     private static IKernel CreateKernel() { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 

     private static void RegisterServices(
      IKernel kernel) { 
      kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
       c => 
        new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "", "", "", ""))).InSingletonScope(); 
     } 
    } 
} 

UPDATE -

+2

DependecyResolverを作成し、デフォルトを上書きしていますか? – Josh

+0

私はそれが 'NinjectWebCommon.cs'ファイルがやっていることだと思っていました。もしそうでなければ、答えは"どこではない "と思います。もう一度、私の他のプロジェクトがこのように動作し、私が嘘をついていないことを確認するために二重と三重をチェックしているので、私の最後には混乱があります... – Gup3rSuR4c

+0

NinjectMvcHttpApplicationPluginがNinject.MVCパッケージにあります'DependecyResolver' ...それはちょうどうまくいくでしょうか?どのようにNinject.MVCをインストールしましたか?ナゲットと? – nemesv

答えて

27

さて、この問題への解決策のリンクや説明のために私の答えを見てください、私は正確な答えがありませんなぜエラーが出てきていますが、わかりますwhoはそれを引き起こしているVisual Studio 2012です。私はVisual Studio 2010を同じマシンに2012年にインストールし、2010年にはASP.NET MVC 4をインストールし、2010年の単語、手紙の手紙に2012プロジェクトを再作成しました。最終的な結果は、2010年がプロジェクトをデバッグするときにすべて正常に動作し、Ninjectは依存関係を注入する必要があるということです。

2012年にプロジェクトがデバッグされるときには、No parameterless constructor defined for this objectの例外が発生します。 2012年の.NET 4.0と.NET 4.5の間の再ターゲッティングは何もしません。 NuGetからNinjectを再インストールすることも何もしません。私は、2010年と2012年の両方のプロジェクトで、ローカルのIISサーバーを使用して確実に最終的な結果を得るように構成しました。

Visual Studio 2012またはNinjectにバグがあると仮定します。私は2つのプロジェクト間で持っている唯一の違いはどこから実行している、2012年のプロジェクトは非常にそれは、私は、Visual Studioで指を指してる理由ですクラッシュだ一つであるIDEである2012年

UPDATE

男。みんな!私はもう一度この問題に遭遇し、別のSO質問の解決策を見つけました:Ninject + MVC3 is not injecting into controller

基本的に、これはWebから欠けているものです。それが仕事になり設定:

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
</dependentAssembly> 

私は、これはフレームワークはNinjectが最終的に結合することができることができますIoCコンテナを認識するように強制的に推測しています。 Ninject NuGetパッケージは、Web.config内のバインドリダイレクトの存在を調べて、自動的に追加する必要があります。これは、この問題に関して多くの髪が引っ張られるのを助けるでしょう。

P.S.それに値するので、私はリンクしたそのポストの上で鼻を投票してください!

+0

私は同じ問題を抱えています。うまくいけば、2つのうちの1つ(VS 2012またはNinject)が問題を解決します。 –

+9

私のmvc4プロジェクトにはこの行がありませんが、それでも動作しません。 – liang

+0

私は必要なものを正確に! – Rowan

3

NuGetからMVC3を取得した後、同じエラーメッセージが表示されました。
プロジェクトの設定が私の場合と同じですが、web.configは環境によって自動的に生成されます。 NuGetからのMVCはに追加rows (<runtime>)であり、マージ設定ファイルが正しく設定されていないため、これらの行が削除されました。

よろしく、

キム

+1

私は要素をWeb設定に追加しなければならなかった。また、にtargetFramework = "4.5"属性が設定されていることを確認してください。これは私のランタイム要素でした。 Michael

+0

、私は要素をassemblybindingだけでなく、ランタイムを追加する必要がありました。Ninject.MVC4 – dbd

47

私はこれが古い質問です知っているが、任意の本当の答えがあるようには思えませんし、私はここでの問題を中心に働いてきたが、私のソリューションです:

あなたがNinjectHttpApplicationを使用している場合はOnApplicationStartedに次の行を追加し、その後

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel ninjectKernel; 
    public NinjectControllerFactory(IKernel kernel) 
    { 
     ninjectKernel = kernel; 
    } 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return (controllerType == null) ? null : (IController) ninjectKernel.Get(controllerType); 
    } 
} 

カスタムコントローラファクトリを作成

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

NinjectHttpApplicationを使用していない場合は、カーネルを作成した後にその行を追加し、新しく作成したカーネルへの参照を渡します。

これだけです。

+1

すごい!男は、あなただけの私の一日保存した。どうもありがとう! – rkrdo

+0

私の場合、私はこのようなコードを使用する必要があります: "DynamicModuleUtility.RegisterModule( NinjectWebCommonのStartメソッドの中で、NinjectWebCommonをあなたのsugestionに置き換えると、このコードをどこに移動するのか分かりません。global.asaxで移動しようとすると、私はアプリケーションの起動時にモジュールを登録するプロセスが遅れることになります。これがNinjectの大きな人物が私に示唆している理由ですNinjectWebCommonを使って解決策をとどめてください。 – Samuel

+0

これにより、ASP MVC5、Ninject3.2、Ninject.MVC3で警告が表示されます。「Ninjectをサービスロケータとして使用しないでください。このソリューションは、回避策のように見えます。 – SandRock

0

MVC 3からMVC 4に移行した最近のプロジェクトで、数時間にわたって私の頭を引っ張っていました。オンポイントの回答がなかったため、 Ninject.MVC3のnugetパッケージはMVC 4とうまく動作します - 実際はそうです。

私の場合、私はMVC3プロジェクトを完全にアップグレードしていませんでした。 this guideに従った後、私は予想通りに仕事をしました。私の推測では、アセンブリバインディングリダイレクトが欠けていたということでした。

MVC 3プロジェクトをMVC 4にアップグレードする場合、Ninjectを使用し、パラメータなしのコンストラクタ定義エラーを取得する場合は、これが役立つことを願ってください。

0

これまでのすべてのポスターから、これが私に灰色の髪の毛を引き起こしていると述べています。私の場合、私は参照をあまりにも "最適化"していました。 Ninject。*のものはそこにありましたが、うんざりしてしまいました。私はすべての参照を削除し、packages.confを整理してパッケージを再度追加しました - 勝利!

1

ここは汚い解決策です! (またはどこか他の)APPSTARTイベントの冒頭でこの

var type = typeof(Ninject.Web.Mvc.MvcModule); 

を入れ

は今、私は誰かがまだ騙しれなかった場合、それが何を意味するのか説明しましょう。 私たちのhttpアプリケーションクラスは、ソリューションのどこにでも置くことができます。Webアプリケーションだけでなく、そして、これは非常に重要です asp.netコンパイルルーチンは通常のライブラリアプリケーションとは異なるためです。これは、BuildManagerヘルパーを介して参照されるすべてのライブラリを熱心に読み込みますが、通常はclrは直接使用されていない限り、タイプをstartからロードしません。

ここで私の状況に戻りましょう:Ninject.Web.Mvcは動的プラグインとして動作します。これはコード内での言及を必要としません。したがって、Mvc.Dependancyの壊れた初期化につながるクラスライブラリ内で参照された場合、ロードされません。

1

ASP.NET 4.0/4.5でVisual Studio 2012/2013を使用すると問題が発生しているようです。 System.Web.MvcのバージョンはWeb.configファイルの4.0.0.0に設定されていました。うまく行かなかった。

私のソリューションは、

  1. 削除

    にしたNinjectWebCommon.cs
  2. コピープロジェクトにDereジョーンズNinjectControllerFactoryクラス:

    public class NinjectControllerFactory : DefaultControllerFactory 
    { 
        private IKernel ninjectKernel; 
        public NinjectControllerFactory(IKernel kernel) 
        { 
         ninjectKernel = kernel; 
        } 
    
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
        { 
         return (controllerType == null) ? null : (IController) ninjectKernel.Get(controllerType); 
        } 
    } 
    
  3. 変更Global.asaxの内容:

    public class MvcApplication : NinjectHttpApplication 
    { 
        protected override IKernel CreateKernel() 
        { 
         IKernel kernel = new StandardKernel(); 
    
         // kernel.Load(Assembly.GetExecutingAssembly()); 
    
         // kernel.Bind<ISomeClass>().To<SomeClass>(); 
    
         return kernel; 
        } 
    
        protected override void OnApplicationStarted() 
        { 
         AreaRegistration.RegisterAllAreas(); 
    
         WebApiConfig.Register(GlobalConfiguration.Configuration); 
         FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
         RouteConfig.RegisterRoutes(RouteTable.Routes); 
         BundleConfig.RegisterBundles(BundleTable.Bundles); 
    
         ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(Kernel)); 
        } 
    } 
    

    その後、注射がうまくいくはずです。

0

私は同じ問題を抱えています。ウェブプロジェクトプロパティの「ローカルIIS Webサーバー」を「Visual Studio開発サーバーを使用」に変更するだけです。

enter image description here

私はなぜ知らないが、私はこれを行う際に、NinjectWebCommonの私のブレークポイントをhitedされます。 @Alexのように、Visual Studio 2012では、アプリケーションをビルドするたびにNinjectWebCommonでコードを実行するのに十分な明るさ​​がありません。それは、それがボンネットの下でどのように機能するかを理解するのに十分明るいわけではない可能性もあります。

自分のローカルIIS Webサーバーを使用したいと思っているので私のソリューションが嫌いですが、現時点ではこのアプリケーションを作成して、この$% ..わからない。

+0

あなたの 'Web.config'に' 'セクションがあることを確認してください。私のプロジェクトはローカルのIISとその設定で正常に動作します。もちろん、バインドリダイレクトは、MVC 5.1が終了しているので、 'にする必要があります。 – Gup3rSuR4c

0

これは、Ninet経由でNinject.Web.MVCにリファレンスを追加することで解決しました。

0

私はこれらすべてのソリューションを試しましたが、うまくいきませんでした。

これは私がそれを解決した方法です。 すべてのtemp asp.netファイルを削除しました。私がこれをした後、私は新しい設定エラーを得ました。私はそれらを修正した。最後の、本当のエラーが出ました。新しいBootstrapper()は、古いバージョンのninject dllをロードしようとしていました。 すべてのninjectパッケージを削除しました。 ninject nugetパッケージを1つずつインストールしましたが、正しいバージョンがインストールされていることを確認してください。

0

私はMVC 5でNinjectをセットアップしようとしました。最後に、コントローラの工場で最初にソリューションを使用し、リダイレクトでソリューションをバインドしなければなりませんでした。その後、すべて期待どおりに動作します。使用されているローカルIISサーバー。

+1

私が現在取り組んでいるプロジェクトは、MVC 5(5.1.2)用です。コントローラーファクトリを使用する必要はありませんでした。私はちょうどバインディングリダイレクトを持っていて、それはすべてうまく動作します。また、ローカルのIISサーバーも使用しています。私はNinjectコードをMVCプロジェクトから分割して、それ自身のプロジェクトに分割しました。 – Gup3rSuR4c

1

すべてがちょっとばかげて、私はAutofacに切り替えました。一度もプロジェクトにNinjectを追加できなくなってしまったのは疲れました。 Web API、MVC4、MVC5にはすべて問題がありました。Ninject MVC3を使用してMVC5の人々のために

、web.configファイルアプリレベルに次の行を追加します。

<runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/> 
       <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> 
      </dependentAssembly> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/> 
       <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> 
      </dependentAssembly> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> 
       <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
7

は車輪の再発明だけインストール・パッケージIだったNinject.MVC3

+1

これは正しい答えです。私はInstall-Package Ninject.MVC5をやってくれました。 – VivekDev

+0

それを釘付け。 Ninject MVC 3をアンインストールしてもう一度インストールし、ソリューション全体を再構築して実行し、修正してください –

0

をしようとしないでくださいコントローラのコンストラクタから#if #endifディレクティブを削除して、MVC5 Webプロジェクトでこの問題を解決できます。すべてこのため

0

ショートカット:以下Nuget Pacakgesのいずれかをダウンロードしてください:あなたが必要とする結合の世話をする

  • Ninject.MVC3
  • Ninject.MVC5

0

Ninject MVC5を削除し、NugetのNinject MVC3をインストールして固定しました。

MVC5 == Ninject.MVC5 
MVC4 == Ninject.MVC3 
MVC3 == Ninject.MVC3 

参照内のSystem.Web.MVCのバージョンを確認して、現在使用しているMVCのバージョンを確認してください。