22

我试图使用 StructureMap 来初始化我从 ApiController 派生的 ValuesController 但我收到一个异常消息:

IControllerFactory '...CustomControllerFactory' 没有返回名称为 'api' 的控制器。

这是代码..

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

        return (Controller)ConcretizationsManager.GetInstance(controllerType);
    }
}

基本上 ConcretizationsManager 是 StructureMap 的包装器。这个方法对于 Controller 类型的控制器总是可以正常运行,但对于 APIController 则不行。

任何人都可以让我走向正确的方向?很感谢

4

2 回答 2

39

对于 Web API,我正在使用这样的自定义ServiceActivator(即,与 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;
    }
}

Factory 是我的 Sturcturemap API 包装器

App_Start\WebApiConfig.cs我确实这样注册:

config.Services.Replace(typeof(IHttpControllerActivator), new ServiceActivator(config));
于 2013-09-25T03:04:29.490 回答
2

StructureMap 3 对此有第一方支持

nuget 安装 Structuremap.WebApi2

StructureMap 4 已发布,也可以使用,但可能需要稍作调整。我还没有为自己确认。

于 2015-12-03T19:25:07.833 回答