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
You don't return a View from an API controller. But you can return API data from an MVC controller.
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.
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));
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With