2014-07-10 1 views
8

일반 컨트롤러로 AngularJs/MVC 프로젝트를 만들었고 SPA 앱으로 더 이동하고 WebApi2를 추가하여 데이터를 내 UI로 다시 전달하기로 결정했습니다. MVC를 사용합니다. 내 Global.asax에에서 AngularJs/MVC5 및 WebApi2 웹 프로젝트와 함께 작동하는 StructureMap을 얻는 방법

나는 내 MVC 프로젝트에 대해 다음했다 :

DependencyResolver.SetResolver (새 StructureMapDependencyResolver (컨테이너));

내 WebApiController에는 데이터베이스와 통신하고 일부 엔티티를 다시 가져 오는 IRepository가있는 생성자가 있습니다. AngularJS 웹 응용 프로그램이 컨트롤러에 전화를 걸면 중단 점이 절대로 발생하지 않으며 서버 500 오류가 거의 발생하지 않습니다.

"예외 유형": "System.ArgumentException", "메시지"

Public class MyController : ApiController 
{ 
    public MyController (IThingRepository thingrepository) 
    { 
    .... 
    } 
} 

내가 좋아하는 오류를보기 시작 "유형 을 'MyProject.Web.Controllers.MyController'기본이없는 생성자 "

기본 생성자를 추가하고 싶지 않습니다. 왜 내가이 문제를 어떻게 해결할 수 있습니까?

답변

15

WebApi 컨트롤러에서 종속성 해결이 작동하지 않기 때문에 이러한 현상이 발생합니다. StructureMap이 생성자를 찾지 못해서 IThingRepository를 해결할 수 없습니다.

WebApi와 MVC는 다르게 작동하며 약간 다른 종속성 해결 메커니즘을 가지고 있습니다. Global.asax 코드 인 "DependencyResolver.SetResolver"는 MVC에서는 작동하지만 WebAPi에서는 작동하지 않습니다. 그럼 어떻게하면 효과가 있습니까?

  1. 이 작업을 수행 할 수 있도록 배관이있는 구조용 구조체 인 StructureMap.MVC5를 설치하십시오.

    설치 패키지 StructureMap.MVC5을

  2. MVC와 WebApi

    public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver 
    { 
        public StructureMapDependencyResolver(IContainer container) : base(container) 
        { 
        } 
        public IDependencyScope BeginScope() 
        { 
         IContainer child = this.Container.GetNestedContainer(); 
         return new StructureMapDependencyResolver(child); 
        } 
    } 
    
  3. 업데이트 Global.asax에 코드 모두를 위해 작동하는 새 StructureMapDependencyResolver 클래스 만들기 :

    //StructureMap Container 
    IContainer container = IoC.Initialize(); 
    
    //Register for MVC 
    DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 
    
    //Register for Web API 
    GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container); 
    

무슨 일이 일어나고 있는지 자세히 알아 보려면 다음을 확인하십시오. 이 블로그 게시물 ASP.NET MVC 4, Web API and StructureMap

+2

Web Api 2 프로젝트에 사용하려는 structuremap.webapi2 NuGet 패키지도 있습니다. 챔피언처럼 작동합니다. – jakejgordon

관련 문제