web-dev-qa-db-ja.com

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

更新-この問題の解決策のリンクと説明については私の回答をご覧ください

38
Gup3rSuR4c

まあ、正確な答えはありませんなぜエラーが発生しますが、whoが原因で、それはVisual Studio 2012です。VisualStudio 2010を2012と同じマシンにインストールし、ASP.NET MVC 4 for 2010をインストールして、2012プロジェクトを2010 Word for Word、letter for letterに再作成しました。最終結果は、2010がプロジェクトをデバッグするときにすべてが正常に機能し、Ninjectが必要に応じて依存関係を注入することです。

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

Visual Studio 2012またはNinjectにバグがあると仮定します。 2つのプロジェクトの唯一の違いは、IDE実行元であり、2012プロジェクトがクラッシュしているため、Visual Studio 2012を指差している理由です。 。

[〜#〜] update [〜#〜]

みんな。みんな!私はこの問題に再び出くわし、別のSO質問: Ninject + MVC3はコントローラーに注入されていません

基本的に、これはWeb.configにないために機能します。

<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でそのバインディングリダイレクトの存在を検索し、自動的に追加する必要があると考えざるを得ません。確かに、この問題で多くの髪を引っ張るのに役立つでしょう。

追伸それに値するので、私がリンクしたその投稿から鼻水に賛成票を投じてください!

28
Gup3rSuR4c

私はこれが古い質問であることを知っていますが、本当の答えはないようで、問題を回避しましたので、ここに私の解決策があります:

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

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

次に、NinjectHttpApplicationを使用している場合は、次の行をOnApplicationStartedに追加します。

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

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

それでおしまい。

48
Jere.Jones

車輪を再発明せずに、Install-Package Ninject.MVC3を試してください

7
Juanjo

NuGetからMVC3を取得した後、同じエラーメッセージが表示されました。
あなたがプロジェクトを私と同じ方法でセットアップしたかどうかはわかりませんが、_web.config_は環境に応じて自動生成されます。 NuGetのMVCはrows (<runtime>)を_web.config_に追加し、構成ファイルのマージが正しくセットアップされなかったため、これらの行は削除されました。

よろしく、

キム

3
Kim Thörning

すべてがばかげている、私は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>
2
Brian Ogden

これが汚い解決策です!これを入れて

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

appStartイベントの開始時(またはその他の場所)

誰かがまだトリックを取得していない場合の意味を説明しましょう。これは、httpアプリケーションクラスがソリューション内のどこにでも存在できることです。 Webアプリケーションだけでなく。 asp.netコンパイルルーチンは通常のライブラリアプリケーションとは異なるため、これは非常に重要です。 BuildManagerヘルパーを介してすべての参照ライブラリを積極的にロードしますが、通常、clrは直接使用しない限り、最初からタイプをロードしません。

それでは、状況に戻りましょう。Ninject.Web.Mvcは動的プラグインとして機能し、コード内での言及は不要です。したがって、クラスライブラリ内で参照された場合は読み込まれず、Mvc.Dependancyの初期化が破損します。

1
wallice

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

私の解決策は

  1. NinjectWebCommon.csを削除
  2. dere Joneの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));
       }
    }
    

    その後、注射が機能するはずです。

1
MovGP0

この問題はWebサービス呼び出しでのみ発生していました。この答えで私の解決策を見つけました https://stackoverflow.com/a/12379938/12958 以下は提供されたサンプルコードです

public class Service : WebService
{
  public IContextProvider ContextProvider {get;set;}

  public Service()
  {
    ContextProvider = DependencyResolver.Current.GetService<IContextProvider>();
  }
}

それが私を変えてしまいました。これが役立つことを願っています...

/// <summary>
/// Summary description for PartMarking
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class PartMarking : System.Web.Services.WebService
{
    private readonly IUnitOfWork _unitOfWork;

    public PartMarking()
    {
        _unitOfWork = DependencyResolver.Current.GetService<IUnitOfWork>();
    }

    [WebMethod]
    public DataSet GetParentConfigurations(string engineModel, string componentCode)
    {
        var results = _unitOfWork.PartMarking.GetParentSicMarkings(engineModel, componentCode);
        return results;
    }
}
1

私は同じ問題を抱えており、私のために働く唯一のことは、Webプロジェクトのプロパティの「ローカルIIS Webサーバー」を「Visual Studio開発サーバーを使用」に変更することです。

enter image description here

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

Local IIS Web Serverを使用することを好むため、私のソリューションは好きではありませんが、現時点では、作成するアプリケーションがあり、この$%で多くの時間がかかります。/bug..feature ..不明。

0
Samuel

NugetからNinject MVC5を削除し、Ninject MVC3をインストールすることで修正しました。

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

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

0
MiloTheGreat

これらすべてのソリューションを試しましたが、どれも機能しませんでした。

これは私がそれをどのように解決したかです:一時asp.netファイルをすべて削除しました。これを行った後、新しい構成エラーが発生しました。それらを修正しました。最後の本当のエラーが出ました:新しいBootstrapper()はninject dllの古いバージョンをロードしようとしていました。すべてのninjectパッケージを削除しました。 ninject nugetパッケージを1つずつインストールし、正しいバージョンがインストールされていることを3回確認します。

0
dawidg

このすべてのショートカット:次のNuget Pacakgesのいずれかをダウンロードします。

  • Ninject.MVC3
  • Ninject.MVC5

これにより、必要なバインディングが処理されます。

0
jhilden

これは、Nugetを介してNinject.Web.MVCに参照を追加することで解決しました。

0
hanzolo

私は、MVC 3からMVC 4に移行した最近のプロジェクトで、これに数時間髪を引っ張っていました。パッケージはMVC 4で正常に動作します-実際に動作します。

私の場合、MVC3プロジェクトを完全にアップグレードしていませんでした。 このガイド をフォローした後、期待通りに動作するようになりました。私の推測では、アセンブリバインディングリダイレクトが欠落していました。

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

0
JasonCoder

以前のポスターのすべてが述べているように、これは私にいくつかの白髪を引き起こしました。私の場合、参照を「最適化」しすぎていました。 Ninject。*がありましたが、壊れてしまいました。すべての参照を削除し、packages.conf manualliを削除し、パッケージを再度追加しました-勝利!

0
juhan_h

コントローラコンストラクタから#if #endifディレクティブを削除することで、MVC5 Webプロジェクトでこの問題を解決できました。

0
James Blake

私はMVC 5でNinjectをセットアップしようとしました。最後に、最初にコントローラーファクトリーでソリューションを使用し、次にバインディングリダイレクトでソリューションを使用する必要がありました。その後、すべて正常に機能します。使用されるローカルIISサーバー。

0
n0ne