39

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

始める前に、これは非常に一般的な質問であり、問​​題なく多くの衛星でNinjectを使用してきましたが、今では問題が発生し、修正方法がわかりません。また、いいえ、これまでのGoogleとSOの結果はどれも私を助けませんでした。

したがって、Windows Server2008R2上のVisualStudio2012の非常に非常に単純なプロトタイプASP.NETMVC4プロジェクトで実行されている次のコードについて考えてみます。

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を使用する他のプロジェクト(ただし、.NET4上のASP.NETMVC 3)の動作方法であり、私が知る限り、これがすべてを動作させるために必要なものです。それで、なぜ私は突然このオブジェクトに定義されたパラメーターのないコンストラクターを取得しないのですか?例外?

アップデート

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

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

4

17 に答える 17

48

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

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

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

それでおしまい。

于 2012-12-25T04:36:13.580 に答える
28

エラーが発生する理由は正確はわかりませんが、原因はわかります。それがVisualStudio2012です。2012と同じマシンにVisualStudio2010をインストールし、ASP.NETMVC4をインストールしました。 2010年に、私は2012年のプロジェクトを2010年の単語ごと、文字ごとに再作成しました。最終的な結果として、2010がプロジェクトをデバッグすると、すべてが正常に機能し、Ninjectが依存関係を適切に注入します。

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

VisualStudio2012またはNinjectにバグがあると想定します。2つのプロジェクトの唯一の違いは、実行しているIDEと2012プロジェクトがクラッシュしていることです。そのため、VisualStudio2012に指を向けています。

アップデート

彼ら。彼ら!私はこの問題に再び遭遇し、別の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>

これにより、フレームワークがIoCコンテナーを認識し、Ninjectが最終的にバインドできるようになると思います。ただし、Ninject NuGetパッケージは、Web.configでそのバインディングリダイレクトの存在を検索し、自動的に追加する必要があると思わざるを得ません。それは確かにこの問題で起こっている多くの髪の毛を引っ張るのに役立つでしょう。

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

于 2012-09-07T21:19:40.987 に答える
7

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

于 2014-07-09T13:40:53.837 に答える
3

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

よろしく、

キム

于 2012-09-19T14:41:18.483 に答える
2

全体がばかげているだけです。私はAutofacに切り替えました。プロジェクトに、Ninjectを正常に追加できることは一度もありませんでした。Web API、MVC4、MVC5はすべて問題がありました。

MVC5の場合、Ninject MVC3を使用して、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>
于 2014-06-14T06:19:41.857 に答える
1

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

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

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

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

次に、状況に戻りましょう。Ninject.Web.Mvcは動的プラグインとして機能し、コード内での言及は必要ありません。したがって、クラスライブラリ内で参照された場合、Mvc.Dependancyの初期化が失敗するため、ロードされません。

于 2013-07-28T15:06:25.697 に答える
1

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

私の解決策は

  1. 消去NinjectWebCommon.cs
  2. DereJoneの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));
       }
    }
    

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

于 2014-01-09T02:55:47.887 に答える
1

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

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;
    }
}
于 2018-08-08T13:34:06.073 に答える
0

私はMVC3からMVC4に移行した最近のプロジェクトで、これに数時間髪を引っ張っていました。オンポイントの回答がないため、Ninject.MVC3 nugetのように見えるので、それは私がやらなければならないと思いました。パッケージはMVC4で正常に動作します-実際に動作します。

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

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

于 2013-06-13T13:56:47.833 に答える
0

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

于 2013-07-09T10:14:55.683 に答える
0

同じ問題が発生します。機能するのは、Webプロジェクトのプロパティの[ローカルIISWebサーバー]を[VisualStudio開発サーバーを使用する]に変更することだけです。

ここに画像の説明を入力してください

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

ローカルIISWebサーバーを使用したいので、ソリューションが気に入らないのですが、今のところ、作成するアプリケーションがあり、この$%?!! /bug..feature..わからないのでかなりの時間がかかりました。 。

于 2014-02-23T04:00:04.933 に答える
0

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

于 2014-04-28T21:06:08.240 に答える
0

私はこれらすべての解決策を試しましたが、どれもうまくいきませんでした。

これが私がそれを解決した方法です:私の一時的なasp.netファイルをすべて削除しました。これを行った後、新しい構成エラーが発生しました。私はそれらを修正しました。最後の、実際のエラーが発生しました。新しいBootstrapper()が古いバージョンのninjectdllを読み込もうとしていました。すべてのninjectパッケージを削除しました。ninject nugetパッケージを1つずつインストールし、正しいバージョンがインストールされていることを3回確認します。

于 2014-05-16T03:48:13.647 に答える
0

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

于 2014-05-30T22:45:02.687 に答える
0

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

于 2015-12-02T21:25:35.940 に答える
0

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

  • Ninject.MVC3
  • Ninject.MVC5

それはあなたが必要とするバインディングの世話をします。

于 2016-05-25T21:57:41.283 に答える
0

NugetからNinjectMVC5を削除し、NinjectMVC3をインストールして修正しました。

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

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

于 2017-03-29T16:14:22.933 に答える