将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));
}
}
如何修复生命周期问题?
您不需要编写自己的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
}
}