将Hyprlinkr与Autofac集成

时间:2013-08-08 09:27:21

标签: c# .net asp.net-web-api autofac hyprlinkr

我正在尝试Hyprlinkr 集成到一个带有Autofac的WebAPI项目中。
我在尝试解析控制器时开始编写自定义IHttpControllerActivator但我得到以下异常

  

没有标记匹配的范围' AutofacWebRequest'是可见的   请求实例的范围。这通常表明   正在请求按照HTTP请求注册的组件   一个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));
    }
}

如何修复生命周期问题

1 个答案:

答案 0 :(得分: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
     }
}