【发布时间】:2013-06-20 14:58:31
【问题描述】:
对于我的 ASP.NET Web API 项目,我有以下设置,它使用 Autofac 作为 IoC 容器:
protected void Application_Start(object sender, EventArgs e)
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.DependencyResolver =
new AutofacWebApiDependencyResolver(
RegisterServices(new ContainerBuilder()));
config.Routes.MapHttpRoute("DefaultRoute", "api/{controller}");
}
private static IContainer RegisterServices(ContainerBuilder builder)
{
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<ConfContext>().InstancePerApiRequest();
return builder.Build();
}
我有以下消息处理程序,它检索 ConfContext 实例只是为了好玩:
public class MyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
ConfContext ctx = (ConfContext)request.GetDependencyScope().GetService(typeof(ConfContext));
return base.SendAsync(request, cancellationToken);
}
}
由于将在构造控制器之前调用我的消息处理程序,因此我应该在控制器上获得相同的 ConfContext 实例。但是,如果我尝试将ConfContext 检索为Func<Owned<ConfContext>>,我想获得单独的实例,但我得到的是相同的实例。如果我删除 InstancePerApiRequest 注册,在我只想按原样检索 ConfContext 的情况下,我将失去 Per API 请求支持。
这里有什么方法可以同时支持这两种情况吗?
编辑
【问题讨论】:
标签: dependency-injection asp.net-web-api inversion-of-control ioc-container autofac