C# 将Hyprlinkr与Autofac集成

C# 将Hyprlinkr与Autofac集成,c#,.net,asp.net-web-api,autofac,hyprlinkr,C#,.net,Asp.net Web Api,Autofac,Hyprlinkr,我正在尝试将与Autofac集成到一个WebAPI项目中。 我已开始编写自定义IHttpControllerActivator,但我在尝试解析控制器时遇到以下异常情况: 从中看不到标记与“AutofacWebRequest”匹配的作用域 请求实例的范围。这通常表明 正在请求按照HTTP请求注册的组件 web下的SingleInstance()组件(或类似场景) 集成始终从服务器请求依赖项 DependencyResolver.Current或ILifetimeScopeProvider.Requ

我正在尝试将与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));
    }
}
公共类AutofacControllerActivator:IHTTPC控制器Activator
{
专用只读IContainer\u容器;
公共自动控制器激活器(IContainer容器)
{
如果(container==null)抛出新的ArgumentNullException(“container”);
_容器=容器;
}
公共IHTTP控制器创建(HttpRequestMessage请求,HttpControllerDescriptor控制器Descriptor,类型controllerType)
{
var linker=\u container.resolve可选(
新的TypedParameter(typeof(HttpRequestMessage),request));
返回(IHTTP控制器)\容器解析(控制器类型,
新的TypedParameter(typeof(IResourceLinker),linker));
}
}

如何解决生命周期问题?

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

您只需要借助
RegisterHttpRequestMessage
方法就可以从容器解析
HttpRequestMessage

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

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

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

您只需要借助
RegisterHttpRequestMessage
方法就可以从容器解析
HttpRequestMessage

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

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

如何在容器中注册您的
RouteLinker
?如果它已经注册了,为什么您需要一个自定义的
AutofacControllerActivator
,因为如果
RouteLinker
在容器中,您可以在控制器构造函数中使用它?
RouteLinker
在运行时依赖于
请求
。如何在容器中注册
RouteLinker
集装箱?如果它已经注册了,为什么您需要一个自定义的
AutofacControllerActivator
,因为如果
RouteLink
在容器中,您可以在控制器构造函数中使用它呢?
RouteLink
在运行时依赖于
请求
。谢谢,就是这样!我选择了
builder.RegisterType()谢谢,就这样!我选择了
builder.RegisterType()