【问题标题】:How to resolve Autofac InstancePerHttpRequest如何解决 Autofac InstancePerHttpRequest
【发布时间】:2012-04-05 11:00:49
【问题描述】:

我在 Global.asax.cs 中注册了一个这样的组件:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());

builder.RegisterType<WebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();

IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// This is where my error happens, not sure why?
var workContext = container.Resolve<IWorkContext>();

WebWorkContext类:

public class WebWorkContext : IWorkContext
{
     // Left out other code
}

IWorkContext接口:

public interface IWorkContext
{
     // Left out other code
}

我得到的错误是:

从请求实例的范围中看不到带有与“httpRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

如何让它工作?我之所以想要这种方式是因为工作上下文处理诸如获取当前客户之类的事情。

还有一些问题。一次注册是否明智/最佳做法?是否会是我需要在另一个阶段添加更多组件的场景?

【问题讨论】:

  • 你想在哪里做你的决议?
  • 我只是在玩,所以这是在应用程序启动方法中构建容器后直接完成的。我不知道如何在我的应用中的其他位置获取容器?

标签: c# asp.net-mvc-3 dependency-injection autofac


【解决方案1】:

标有InstancePerHttpRequest 的注册预计会从在每个 HTTP 请求期间创建和处置的特定嵌套生命周期范围内解析。

如果您将IWorkContext 作为构造函数参数添加到您的控制器之一,您会发现注入了一个实例。在您的代码中,您尝试从根生命周期范围而不是嵌套的“每个请求”生命周期范围解析您的服务。

如果您想在不运行应用程序的情况下测试解析服务,您将需要创建一个生命周期范围,其标签与在 HTTP 请求期间创建的标签相同。在 MVC 3 集成中,生命周期范围标记为“httpRequest”。

using (var httpRequestScope = container.BeginLifetimeScope("httpRequest"))
{
    Assert.That(httpRequestScope.Resolve<IWorkContext>(), Is.Not.Null);
}

我想我会更新 MVC 集成以通过 API 公开“httpRequest”标签名称,这样字符串值就不需要硬编码。也可以将您自己的ILifetimeScopeProvider 实现传递给AutofacDependencyResolver,以便您可以控制在ASP.NET 运行时之外的生命周期范围的创建。当没有可用的 HTTP 请求时,这在单元测试中很有用。

【讨论】:

  • 是的,请将 RequestLifetimeScopeProvider 中的 HttpRequestTag 公开。那么我们就不需要对标签值进行硬编码了。
【解决方案2】:

我在 WebForms 中这样做:

this.RoutingService = ((Global)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime.Resolve<RoutingService>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多