2014-07-10 4 views
8

Итак, у меня есть проект AngularJs/MVC с обычными контроллерами и вы решили переместить больше в приложение SPA и добавить WebApi2 для передачи данных обратно в мой интерфейс, а не используя MVC.Как получить StructureMap, работая с веб-проектом AngularJs/MVC5 и WebApi2

В моей Global.asax я имел следующий для моего проекта MVC:

DependencyResolver.SetResolver (новый StructureMapDependencyResolver (контейнер));

У моего WebApiController есть конструктор с IRepository, чтобы поговорить с базой данных и вернуть некоторые объекты. Когда мое приложение AngularJS совершает вызов контроллера, точки останова никогда не попадают, и я получаю ошибки сервера 500 с очень маленькой информацией.

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

я начал видеть ошибки как:

"ExceptionType": "System.ArgumentException", "Сообщение": «Тип 'MyProject.Web.Controllers.MyController' не имеет значения по умолчанию конструктор "

Я не хочу добавлять конструктор по умолчанию. Почему я получаю это и как его исправить?

ответ

15

Это происходит потому, что разрешение не работает для контроллера WebApi. StructureMap не находит конструктор и не может разрешить IThingRepository.

WebApi и MVC работают по-разному и имеют несколько другую механику разрешения зависимостей. Код Global.asax «DependencyResolver.SetResolver» работает для MVC, но не для WebAPi. Итак, как мы получим эту работу?

  1. Установите пакет nuget StructureMap.MVC5, у которого есть сантехника, чтобы сделать эту работу.

    Install-Package StructureMap.MVC5

  2. Создать новый класс StructureMapDependencyResolver, который работает как для 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:

    //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

Существует также пакет structuremap.webapi2 NuGet, который вы хотели бы использовать для проектов Web Api 2. Работает как чемпион. – jakejgordon