1

我正在尝试将Hyprlinkr与 Autofac集成到 WebAPI 项目中。
我已经开始编写自定义IHttpControllerActivator,但在尝试解析控制器时出现以下异常:

从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

下面是这个类的样子:

public class AutofacControllerActivator : IHttpControllerActivator
{
    private readonly IContainer _container;

    public AutofacControllerActivator(IContainer container)
    {
        if (container == null) throw new ArgumentNullException("container");
        _container = container;
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var linker = _container.ResolveOptional<RouteLinker>(
            new TypedParameter(typeof(HttpRequestMessage), request));

        return (IHttpController) _container.Resolve(controllerType,
            new TypedParameter(typeof(IResourceLinker), linker));
    }
}

如何解决生命周期问题

4

1 回答 1

1

您不需要自己编写,IHttpControllerActivator因为您可以RouteLinker在容器中注册自身。

您只需要使容器可解析的RegisterHttpRequestMessage方法的帮助。HttpRequestMessage

因此,您的RouteLinker注册将如下所示:

builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);
builder.Register(c => new RouteLinker(c.Resolve<HttpRequestMessage>()))
       .InstancePerApiRequest();

现在你可以依赖RouteLinker于你的控制器:

public MyController : ApiController 
{
     public MyController(RouteLinker routeLinker)
     {
          //do stuff with routeLinker
     }
}
于 2013-08-08T09:40:51.697 回答