Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
420 views
Welcome To Ask or Share your Answers For Others

1 Answer

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_StartWebApiConfig.cs I do register that like this:

config.Services.Replace(typeof(IHttpControllerActivator), new ServiceActivator(config));

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...