Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebAPI + APIController with structureMap

Tags:

Im trying to use StructureMap to initialize my ValuesController that derivate from ApiController but i'm getting an exception that says:

The IControllerFactory '...CustomControllerFactory' did not return a controller for the name 'api'.

Here is the code..

public class CustomControllerFactory : DefaultControllerFactory {     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)     {         if (controllerType == null)             return null;          return (Controller)ConcretizationsManager.GetInstance(controllerType);     } } 

basically ConcretizationsManager is a wrapper of StructureMap.. This method always runs ok for Controllers of Controller type, but for APIController dont.

Anyone to get me to the right direction? Very thanks

like image 243
gds03 Avatar asked Sep 19 '13 13:09

gds03


People also ask

Can ApiController return view?

You don't return a View from an API controller. But you can return API data from an MVC controller.

What is the difference between controller and ApiController?

They work similarly in Web API, but controllers in Web API derive from the ApiController class instead of Controller class. The first major difference you will notice is that actions on Web API controllers do not return views, they return data. ApiControllers are specialized in returning data.


2 Answers

For the Web API I am using Custom ServiceActivator like this (i.e. different factory then for MVC):

public class ServiceActivator : IHttpControllerActivator {     public ServiceActivator(HttpConfiguration configuration) {}          public IHttpController Create(HttpRequestMessage request         , HttpControllerDescriptor controllerDescriptor, Type controllerType)     {         var controller = Factory.CreateInstance(controllerType) as IHttpController;         return controller;     } } 

Where Factory is my wrapper of the Sturcturemap API

And in the App_Start\WebApiConfig.cs I do register that like this:

config.Services.Replace(typeof(IHttpControllerActivator), new ServiceActivator(config)); 
like image 166
Radim Köhler Avatar answered Sep 28 '22 21:09

Radim Köhler


There is first party support for this with StructureMap 3

nuget install Structuremap.WebApi2

StructureMap 4 has been released and could be used also, however there may be slight tweaks needed. I have not confirmed for myself.

like image 38
Chris Marisic Avatar answered Sep 28 '22 19:09

Chris Marisic