3

.NET Framework 4、MVC 4、Ninject3を使用するWebアプリケーションがあります。元々は.NETFramework 4.5を使用していましたが、「ターゲットフレームワーク」を4.0に変更し、発生したすべてのエラーを修正しました。これで、アプリケーションは私のローカルボックスで完全に実行されます。問題は、Azureにデプロイすると、この投稿の下部にサーバーエラーが表示されることです。

私は以前にこのエラーを見たことがあります。Ninjectを最初に使用し始めたとき、Global.asax(以下の関連コード)で正しくバインドしていなかったときにこのエラーが発生しました。

また、Ninject.dll参照の「ローカルコピー」プロパティが「True」に設定されています。

私は何が間違っているのですか?ローカルボックスではなくAzureでWebアプリケーションを表示しようとすると、このエラーが発生するのはなぜですか?

ご協力ありがとうございました、

アーロン

HomeController.cs

public class HomeController : Controller
{
    IAuthorizationService _authorizationService;
    IUserService _userService;

    public HomeController(IAuthorizationService authorizationService, IUserService userService)
    {
        _authorizationService = authorizationService;
        _userService = userService;
    }
}

Global.asax

protected void Application_Start()
{
    SetupDependencyInjection();
}

private void SetupDependencyInjection()
{
    //create Ninject DI Kernel
    IKernel kernel = new StandardKernel();

    //register services with Ninject DI container
    RegisterServices(kernel);

    //tell asp.net mvc to use our Ninject DI Container
    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

private void RegisterServices(IKernel kernel)
{
    kernel.Bind<IAccountService>().To<AccountService>().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["AccountManagerEntities"].ConnectionString);
}

サーバーエラー

No parameterless constructor defined for this object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +117
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +247
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +106
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +84

[InvalidOperationException: An error occurred when trying to create a controller of type 'AccountManager.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +85
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +280
   System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +66
   System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +19
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +161
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +405
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375
4

2 に答える 2

4

Sandrino Di Mattia、あなたは正しいです、私は他のインターフェースを登録する必要があります。実際、私はそれらを登録しています。サンプルコードの要点を明確にするために、関連する部分を切り取りました。:p

私が修正した方法は、NuGetを使用してNinjectをアンインストールしてから、NuGetを使用して再インストールすることでした。4.5から再ターゲットした後、.NET 4.0で正しくインストールできるようにするには、EntityFrameworkでこれを行う必要があるというインターネット上の記事を読んだことがあります。それで、それが私のEFの問題を解決したとき、私はNinjectでそれを試しました、そしてそれはうまくいきました。

したがって、このすべての教訓は、.NET4.5から.NET4.0に再ターゲットし、NuGetパッケージをアンインストールしてから、それらを再インストールする場合です。

アーロン

于 2012-08-24T22:47:32.380 に答える
4

この問題は、実際にはNinject構成の問題です。あなたのRegisterServicesメソッドでは、1つのインターフェースを登録しています:IAccountService。ここで欠落しているのは、HomeControllerに挿入しようとしているインターフェイスの登録です。

  • IAuthorizationService
  • IUserService

Ninjectはこれらのインターフェースの実装を認識していないため、HomeControllerクラスで指定したコンストラクターを使用できません。デフォルトのパラメーターなしのコンストラクターを探していますが、このコンストラクターは存在しません。

解決策は単純です。これを正しく機能させるには、IAuthorizationServiceとを登録する必要があります。IUserService

于 2012-08-17T21:58:45.110 に答える