我正在尝试将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));
}
}
如何修复生命周期问题?
答案 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
}
}