[C#] ASP.NET MVC 4 + Ninject MVC 3 =이 객체에 대해 정의 된 매개 변수없는 생성자 없음


Answers

글쎄, 오류가오고 있는지 정확한 답변을 모르겠지만 누가 그것을 일으키는 지 Visual Studio 2012입니다. 나는 같은 컴퓨터에 Visual Studio 2010을 설치했는데, 설치된 ASP.NET MVC 4 2010 년에 나는 2010 년 단어에 대한 2012 년 프로젝트를 편지를위한 편지로 재창조했습니다. 최종 결과는 2010 년이 프로젝트를 디버깅 할 때 모든 것이 잘 작동하고 Ninject가 의존성을 주입해야한다는 것입니다.

2012가 프로젝트를 디버깅 할 No parameterless constructor defined for this object 예외에 No parameterless constructor defined for this object . 2012 년에 .NET 4.0과 .NET 4.5 사이의 재 타겟팅은 아무 것도하지 않습니다. NuGet에서 Ninject를 재설치해도 아무런 변화가 없습니다. 심지어 2010 년과 2012 년 프로젝트 모두 로컬 IIS 서버를 사용하여 최종 결과가 동일하다는 확신을주었습니다.

Visual Studio 2012 또는 Ninject에 버그가 있다고 가정합니다. 두 프로젝트 사이에 유일한 차이점은 그들이 실행중인 IDE와 2012 프로젝트가 충돌하여 Visual Studio 2012를 가리키는 이유입니다.

최신 정보

얘들 아. 얘들 아! 나는이 문제를 다시 만났고 또 다른 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에서 바인딩 바인딩의 존재를 찾아 자동으로 추가해야한다고 생각합니다. 이 문제에 대해 많은 머리카락이 당겨지는 데 도움이 될 것입니다.

추신 - 내가 그것을받을 가치가 있기 때문에 내가 링크 된 그 게시물에서 콧물을 투표하십시오!

Question

업데이트 -이 문제의 해결책에 대한 링크와 설명에 대한 제 대답을 확인하십시오.

시작하기 전에 이것은 매우 일반적인 질문이며 문제없이 많은 위성에 대해 Ninject를 사용해 왔지만 이제는 문제가 생겨서 해결 방법을 찾을 수 없다는 것을 알고 있습니다. 또한 Google과 Google의 결과 중 아무 것도 지금까지 나를 도왔습니다.

따라서 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 MVC 3 on .NET 4)를 사용하는 다른 프로젝트가 어떻게 작동하고 모든 것을 작동시키는 데 필요한지 알 수 있습니다. 그래서, 왜 갑자기이 객체에 대해 정의 된 매개 변수없는 생성자없습니다. 예외?

최신 정보

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

업데이트 -이 문제의 해결책에 대한 링크와 설명에 대한 제 대답을 확인하십시오.




내 컨트롤러 생성자에서 #if #endif 지시문을 제거하여 MVC5 웹 프로젝트에서이 문제를 해결할 수있었습니다.




MVC 3에서 MVC 4로 옮겨진 최근 프로젝트에서 몇 시간 동안 머리카락을 꺼내고있었습니다. 포인트 응답이 부족하여 Ninject.MVC3 Nuget 패키지는 MVC 4에서 정상적으로 작동합니다.

필자의 경우 MVC3 프로젝트를 완전히 업그레이드하지 못했습니다. 이 가이드를 따른 후에 예상대로 작동 할 수있는 것들이 있습니다. 제 생각 엔 어셈블리 바인딩 리디렉션이 누락되었습니다.

따라서 MVC 3 프로젝트를 MVC 4로 업그레이드 할 때 Ninject를 사용하고 매개 변수없는 생성자 정의 오류를 얻는다면 이것이 도움이되기를 바랍니다.




Ninject MVC5 제거 및 Ninject MVC3 설치 (Nuget)를 통해 광산을 수정했습니다.

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

참조에있는 System.Web.MVC의 버전을 확인하여 현재 사용중인 MVC의 버전을 확인하십시오.




이 문제는 ASP.NET 4.0 / 4.5에서 Visual Studio 2012/2013을 사용할 때 발생하는 것으로 보입니다. System.Web.Mvc 의 버전은 Web.config 파일에서 4.0.0.0 으로 설정되었습니다. 그것은 작동하지 않았다.

내 해결책은

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

    그 후에 당신의 주사가 효과가 있어야합니다.




나는이 모든 해결책을 시도했지만 아무도 효과가 없었다.

이것은 내가 그것을 해결하는 방법입니다 : 모든 임시 asp.net 파일을 삭제했습니다. 이 작업을 마친 후에 새로운 설정 오류가 발생했습니다. 나는 그들을 고쳤다. 마지막으로 실제 오류가 발생했습니다 : 새로운 Bootstrapper ()가 ninject dll의 이전 버전을로드하려고했습니다. 모든 ninject 패키지를 제거했습니다. ninject nuget 패키지를 하나씩 설치하고 올바른 버전이 설치되어 있는지 확인하십시오.




나에게는 똑같은 문제가 있으며, 나에게 맞는 유일한 방법은 웹 프로젝트 속성에서 "로컬 IIS 웹 서버"를 "Visual Studio Development Server 사용"으로 변경하는 것이다.

이유는 모르겠지만이 작업을 수행 할 때 NinjectWebCommon의 중단 점이 발생합니다. @Alex와 마찬가지로 Visual Studio 2012에서는 응용 프로그램을 빌드 할 때마다 NinjectWebCommon에서 코드를 실행하기에 충분하지 않습니다. 후드 아래에서 어떻게 작동하는지 이해하는 것은 나만큼 밝지 않을 수도 있습니다.

내 로컬 IIS 웹 서버를 사용하기를 선호하기 때문에 내 솔루션이 마음에 들지 않지만 지금 당장은이 응용 프로그램을 만들어서이 $ %를 (를) 가져 왔고 버그 / 기능 ... 확실하지 않습니다. .




NuGet에서 MVC3을 가져온 후 동일한 오류 메시지가 나타납니다.
프로젝트 설정이 내가하는 것과 같은 방식으로되어 있는지 모르겠지만 web.config 는 환경에 따라 자동으로 생성됩니다. NuGet의 MVC가 web.config rows (<runtime>) 을 추가하고 병합 구성 파일이 올바르게 설정되지 않아 해당 행이 제거되었습니다.

문안 인사,




Links