2012-10-02 2 views
1

ASP.NET 웹 API를 처음 사용합니다.Ninject가 ASP.NET MVC 4의 웹 API 생성자에서 작동하지 않습니다.

this tutorial을 사용하여 ASP.NET MVC 3 프로젝트를 ASP.NET MVC 4로 업그레이드했습니다.

여기서 Web Api를 사용하려고합니다. 여기서 ninject를 사용하려고하는 것을 볼 수 있습니다. 그러나 ProductsController 생성자를 그런 식으로 선언하면 작동하지 않습니다.

public class ProductsController : ApiController 
{ 
    private readonly IProductService _productService; 

    public ProductsController(IProductService productService) 
    { 
     this._productService = productService; 
    } 

    public List<Product> GetProducts() 
    { 
     return _productService.GetAllProducts(); 
    } 
} 

도와주세요.

이 생성자를 추가하면 Web Api 메서드에 대한 호출이 없으므로 중단 점을 사용하여이를 확인하고 그렇지 않으면 호출합니다.

1 : 브라우저 읽는 XML 오류가

<Error><Message>An error has occurred.</Message></Error>

내 NinjectWebCommon.cs 클래스 코드 당신은 WebApi 최대 Ninject에와 실행을 얻기 위해 다음 단계를 수행 할 수

[assembly: WebActivator.PreApplicationStartMethod(typeof(Web.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(Web.App_Start.NinjectWebCommon), "Stop")] 

namespace Web.App_Start 
{ 
    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     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; 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind<IProductService>().To<ProductService>();    
     }   
    } 
} 
+0

그리고 무엇을 의미 예를 들어 정확하게 "이 작동하지 않습니다"? –

+0

어떤 오류 메시지가 보입니까? –

+0

아, 죄송합니다. 나는 그것을 놓쳤습니다! 이 생성자를 추가하면 Web API 메서드에 대한 호출이 없으므로 중단 점을 사용하여이를 확인하고 그렇지 않으면 호출합니다. 브라우저에 ''이라는 XML 오류가 표시됩니다. 오류가 발생했습니다. Yasser

답변

1

보여줍니다 새 WebApi 프로젝트를 만듭니다 2 필드 및 생성자에 대한 다음 코드를 기본 ValuesController에 추가합니다.

private IFooService _foo; 

public ValuesController(IFooService foo) 
{ 
    _foo = foo; 
} 

3 인터페이스 IFooService 및 클래스 FooService

public interface IFooService 
{ 
} 

public class FooService : IFooService 
{ 
} 

4 실행

설치 패키지 Ninject.MVC3

Ninject에

를 설치하여 Nuget Packag 관리자 콘솔에서 다음 명령을 만듭니다 5 메서드의 App_Start \ NinjectWebCommon.cs에 다음 바인딩을 추가합니다. RegisterServices(IKernel kernel)

kernel.Bind<IFooService>().To<FooService>().InRequestScope(); 

코드에서 적절한 순간에 NInject 구성을 호출하지 않은 것일 수 있습니다. 당신이 Nuget 패키지를 사용하면 당신은 당신의 Ninject에 파일의 맨 위에 다음 줄을 얻을 :

[assembly: WebActivator.PreApplicationStartMethod(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Stop")] 

이 라인은 코드가 적절한 시간에 실행되어 있는지 확인합니다.

+1

나는 모든 단계를 수행했습니다. ,하지만 여전히 작품을하지 않습니다 – Yasser

+0

고마워, 내 자신의 솔루션을 게시했습니다. – Yasser

-9

업데이트 : 매우 멋진 설명 : http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/, 이제 더 이상 ProductsController(): this(new ProductService())을 사용할 필요가 없습니다.

아 슬프 도다이 지금 작업 :

다음

내가 무슨 짓을 ...

내 WebApiController 각각 두 개의 생성자가 있어요. 내 내가 정의하는 데 필요한 생성자는 다음과 같이했다 지금은 ProductsController가 ...

public class ProductsController : ApiController 
{ 
    private readonly IProductService _productService; 

    public ProductsController(): this(new ProductService()) 
    { 
    } 

    public ProductsController(IFolderService productService) 
    { 
     this._polderService = productService; 
    } 

    public List<Product> GetProducts() 
    { 
     return _productService.GetAllProducts(); 
    } 
} 

:

+2

이것은 진정한 의존성 주입이 아닙니다. WebApi와 Ninject는 완벽하게 함께 작동 할 수 있습니다. 내 대답에서 언급 한 단계를 수행하면 작동합니다. –

+0

투표가 끝났습니까? 이것은 ** 내 문제 **에 대한 해결책입니다. – Yasser

+0

그리고 이전에 이미 말했듯이 @WouterdeKort 당신의 솔루션이 저에게 맞지 않았습니다 – Yasser

관련 문제