4

私たちの MVC プロジェクトでは、Ninject を広く使用しています。理由は不明ですが、StandardKernel が NotSupportedException をスローし始め、「名前が null または空のモジュールはサポートされていません」というメッセージが表示されました。コードは次のとおりです。

        var _kernel = new StandardKernel(); // <-- this line throws exception
        _kernel.Bind<ISessionFactory>().ToMethod(x =>
            {
                 // some code...
            }).InSingletonScope();
        _kernel.Bind<IAppDomainSetup>().To<AppDomainSetup>();

誰が何が間違っているのか考えていますか? ありがとう。

PSは、アセンブリバージョンを確認するためのナゲット構成です

  <package id="Ninject" version="3.0.1.10" targetFramework="net45" />  
  <package id="Ninject.MVC3" version="3.0.0.6" targetFramework="net45" />   
  <package id="Ninject.Web.Common" version="3.0.0.7" targetFramework="net45" />

そしてここにスタックトレースがあります

  at Ninject.KernelBase.Load(IEnumerable`1 m) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 207
   at Ninject.KernelBase.Load(IEnumerable`1 assemblies) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 245
   at Ninject.Modules.CompiledModuleLoaderPlugin.LoadModules(IEnumerable`1 filenames) in c:\Projects\Ninject\ninject\src\Ninject\Modules\CompiledModuleLoaderPlugin.cs:line 82
   at Ninject.Modules.ModuleLoader.LoadModules(IEnumerable`1 patterns) in c:\Projects\Ninject\ninject\src\Ninject\Modules\ModuleLoader.cs:line 60
   at Ninject.KernelBase.Load(IEnumerable`1 filePatterns) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 236
   at Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 97
   at Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 57
   at Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:line 46
   at TradeNet.Web.MvcApplication.CreateKernel() in c:\Users\dpopiashvili.DEA\Documents\Visual Studio 2010\Projects\TradeNet\TradeNet.Web\Global.asax.cs:line 65
   at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:line 50
   at Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:line 80
4

1 に答える 1

4

StandardKernelifLoadExtensionsプロパティがクラスtrueの (これはデフォルト値です) を作成するときNinjectSettings、Ninject はアプリケーション ディレクトリをスキャンして、拡張機能からモジュールをロードしますdll

デフォルトでは、次のパターンを検索します。

"Ninject.Extensions.*.dll",
"Ninject.Web*.dll"

INinjectModule見つかった dll からすべての実装をロードします。

あなたの場合、ロードされたモジュールのNameプロパティの1つがnull.

これは、次の 2 つの場合に発生する可能性があります。

  • Ninject が を明示的に実装したモジュールをロード し、名前としてINinjectModule返されたモジュール、またはデフォルトの実装nullから派生したがオーバーライドされて返されたモジュールNinjectModuleNamenull
  • または、返されたデフォルトのName実装...ただし、ソースコードは次のようになります。NinjectModulenullName

    public virtual string Name
    {
         get { return GetType().FullName; }
    }
    

    そのため、 Type.FullNameが返されるnull場合にのみ返されますが、これは非常にまれなケースで発生する可能性があります。null

Nameしたがって、問題を解決するには、どの拡張機能/モジュールにnullがあるかを調べる必要があります。

  • ロードされた Ninject/Extension dll をfusion ログでチェックして、正しいものをロードしていることを確認できます。
  • ロードされたモジュールをtry-catchしnew StandardKernel()てログアウトできます

     try
     {
         _kernel = new StandardKernel();
     }
     catch
     {
        var modules =
            AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetExportedTypes()
                .Where(t => typeof(INinjectModule).IsAssignableFrom(t)))
                .ToArray();
     }
    

問題の原因がわかるまでINinjectModule、拡張機能の自動読み込みをオフにして手動でMvcModulewith を読み込むことができます

var _kernel = new StandardKernel(
     new NinjectSettings() { LoadExtensions = false }, new MvcModule());
于 2013-11-09T11:26:39.247 に答える