将Hyplinkr与Autofac集成

本文关键字:集成 Autofac Hyplinkr | 更新日期: 2023-09-27 18:26:47

我正在尝试将Hyplinkr集成到具有Autofac的WebAPI项目中
我已经开始编写自定义IHttpControllerActivator,但在尝试解析控制器时,我遇到以下异常

标记与"AutofacWebRequest"匹配的作用域在请求实例的范围。这通常表明根据HTTP请求注册的组件正由web下的SingleInstance()组件(或类似场景。)集成总是从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));
    }
}

如何修复生命周期问题

将Hyplinkr与Autofac集成

您不需要编写自己的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
     }
}