2012-02-23 5 views
11

막혔습니다. 나는 wcf web api p6 Ninject working with WCF Web API Preview 5에 대해 여기에 설명 된 방법을 사용하고 있었지만, 베타의 mvc 구현과는 상당히 다릅니다. 좋은 기사 여기에 http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver 자신의 사용자 지정 의존성 해결자를 구축하는 방법에 대해 이야기하지만, 나는 내 MVC 컨트롤러를 위해 사용하고있는 동일한 구현을 사용하고 싶습니다. Ninject. 기사의 IoC Unity 예제를 기반으로 몇 가지 사항을 시도했지만 아무 것도 아직 결정되지 않았습니다. 나를 올바른 방향으로 향하게 도와 주면 도움이 될 것입니다. 나 혼자서 계속 파고 갈거야. 미리 감사드립니다!Asp.NET 웹 API Beta ApiController에서 Ninject 사용

여기 내가있는 곳입니다. 코드를 부트 스트랩하기 위해 WebActivator를 사용하고 있었지만 방금 방정식에서 한 가지 더 꺼내기 위해 Application_Start()에 놓았습니다.

protected void Application_Start() 
    { 
     var kernel = new StandardKernel(new MyNinjectModule()); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
    } 

그리고 다음과 같은 오류를 수신하고 있습니다 :
Ninject.Web.Mvc.NinjectDependencyResolver이 Microsoft.Practices.ServiceLocation.IServiceLocator을 구현 나타나지 않는 유형입니다.
매개 변수 이름 : commonServiceLocator


은 아마도이 솔루션을 찾을 수/더 우아한 방법이 될 것입니다하지만 지금은 나를 위해 노력하고 있습니다. 또한 여기에 사용자 지정 메시지 처리기를 추가하고 있습니다.

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")] 
namespace MyApp.AppStart 
{ 
    public class ApiBootstrapper 
    { 
     public static void Start() 
     { 
      var kernel = new StandardKernel(new MyNinjectModule()); 
      var resolver = new NinjectDependencyResolver(kernel); 
      GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices); 
      GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler()); 
     } 
    } 
} 
+0

이 상당히 좋은 솔루션입니다 : http://haacked.com/archive/2012/03/11/itrsquos- the-little-things-about-asp-net-mvc-4.aspx –

+0

도 컨트롤러의 두 가지 유형에 대해 동일한 바인딩을 사용하려는 경우 아래 @Remo Gloor의 패키지를 체크 아웃하십시오. github에서 찾을 수 있으며 Nuget에서 설치할 수 있습니다. –

답변

3

은 내가 WebAPI를 사용한 적이 있지만 IDependencyResolver의 의미가 MVC3의 것과 동일하기 때문에 동일한 구현을 사용할 수 있어야합니다 : https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

업데이트 : Ninject.Web을 .WebAPi 확장 기능이 ApiControllers에 대한 지원을 추가합니다.

+2

이것은 실제로 불행히도 기쁨이없는 시도한 것 중 하나입니다. 예를 들어 ServiceResolver.SetResolver (new NinjectDependencyResolver (kernel))는 다음 오류를 생성합니다. _Ninject.Web.Mvc.NinjectDependencyResolver가 Microsoft.Practices.ServiceLocation.IServiceLocator_ –

+0

을 구현하는 것으로 보이지 않습니다. 해결책은 궁극적으로 ninjectdepencencyresolver 클래스를 사용하는 것이 었습니다. setresolver에서 대체 메소드 서명을 사용합니다. 답변 해주셔서 감사합니다! –

0

어리석게 들릴 수도 있지만 CommonServiceLocator/CommonServiceLocator.NinjectAdapter Nuget 패키지 또는 관련 어셈블리에 대한 참조가 있는지 확인해야합니다. NinjectDependencyResolver가 IServiceLocator에 대한 참조를 해결하지 못할 수 있습니다.

+0

두 패키지를 모두 설치했지만 여전히 운이 없다. 당신은 ninject.mvc packacke가 현재 webactivator를 사용하는 커스텀 부트 스트 래퍼를 통해 어떻게 연결되는지를 볼 수 있습니다 ... 그러나 reqeust가 실제로 컨트롤러에 직접 연결되지 않기 때문에 apicontroller 요청 라이프 사이클 밖에 있어야합니다 ... 프레임 워크에 의해. –

+0

문제는 내 코드가이 메서드 시그니처로 해결되었다는 것이 었습니다. http://msdn.microsoft.com/en-us/library/hh835505(v=vs.108).aspx이 코드는 http : // /msdn.microsoft.com/en-us/library/hh835218(v=vs.108).aspx. 고맙게도 유형 문제를 해결하는 세 번째 옵션이 있습니다. Hamaze의 답변 주셔서 감사합니다! –

1

답변을 찾았으며 위의 질문을 해결책으로 업데이트했습니다. 그 자체로 해결책은 Using the Web API Dependency Resolver 기사에 더 많거나 적었습니다. 나는 그저 ninject에 대해 계속 조정해야했습니다. 두 답은 @Remo와 @James 덕택에 신속하게이 범위를 좁히는 데 도움이되었습니다.

+0

바인딩과 나머지 어댑터 코드를 시작할 때 몇 가지 코드 예제를 제공 할 수 있습니까? –

+1

@ShawnMclean 나는 너를 따라갈 지 모르겠다. 위의 솔루션에서 webactivator nuget 패키지를 사용하여 ninject 종속성 해결 프로그램을 webapi (ninjectmodule에서 파생 된 별도 클래스에 바인딩 정의)에 등록합니다. 동일한 메소드 코드를 global.asax 파일 Application_Start() 메소드에 넣을 수도 있습니다.이 부트 스트래핑 방식을 선호합니다. 위의 응답에는 Phil Haack의 솔루션이 언급되어 있습니다.이 솔루션은 기본적으로 mvc 및 web API 모두에 동일한 바인딩을 사용할 수있게합니다. 그러나 나는 당분간 나의 방법을 선호한다. –

0

동일한 코드가 MVC와 WebApi 모두에서 작동하지만 WebApi가 MVC에서 영감을 받았으며 MVC 어셈블리를 WebApi (또는 그 반대)를 사용하기 위해 참조 할 필요가 없기 때문에 상당한 금액이 있습니다. 두 프레임 워크 간의 코드 중복 MVC를 사용하려면 의존성이 System.Web.Mvc에서 올 것이고 WebApi를 사용하려면 System.Web.Http을 사용하십시오. 두 가지를 모두 사용하려면 더 명확한 네임 스페이스 해석을 사용하여 언제 사용할 코드에서 구별해야합니다.

귀하의 경우 귀하의 문제는 MVC가 처음이며 NinjectDependancyResolver 클래스가 System.Web.Mvc.IDependencyResolver에서 상속된다는 것입니다. NinjectDependancyResolver 클래스의 정확한 복제본을 만들고 대신 System.Web.Http.IDependencyResolver에서 상속받습니다. 이 클래스를 사용하여 IoC를 설정하면 도움이 될 것입니다.

+0

응답 해 주셔서 감사합니다! 이것은 본질적으로 당신이 설명하는 중복 문제 때문에 위의 대답에서 한 것입니다. 그러나이 과부하가 setresolver에 있기 때문에 http://msdn.microsoft.com/en-us/library/hh834083(v=vs.108).aspx 시스템을 구현하는 중복 된 ninject 종속성 해결 프로그램을 만들 수있었습니다. 인터페이스의 .web.http 버전. 나는 그들이 이것을 처리하는 더 좋은 방법을 찾았 으면 좋겠다. 난 정말 모두에 대해 동일한 의존성 해결 프로그램을 사용할 수 있어야합니다. –

0

좋은 해결책을 찾았습니다 here.이미 Ninject에 CommonServiceLocator/부트 스트 래퍼를 사용하는 경우

그것은 꽤 쉽게 :

private static IKernel CreateKernel() { 
    var kernel = new StandardKernel(); 
    RegisterServices(kernel); 

    GlobalConfiguration.Configuration.ServiceResolver 
     .SetResolver(new NinjectServiceLocator(kernel)); 
    return kernel; 
}