C# 将Hyprlinkr与Autofac集成
我正在尝试将与Autofac集成到一个WebAPI项目中。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
我已开始编写自定义
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()代码>