我已经在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接口(interface):
public interface IWorkContext
{
     // Left out other code
}

我得到的错误是:



我该如何工作?我之所以这样想,是因为工作环境处理诸如获取当前客户等问题。

还有更多问题。一次注册是否明智/最佳实践?会不会是我需要在另一个阶段添加更多组件的方案?

最佳答案

标记为InstancePerHttpRequest的注册应从每个HTTP请求期间创建和处置的特定嵌套生存期范围中解析。

如果将IWorkContext作为构造函数参数添加到其中一个 Controller ,则会发现实例已注入(inject)。在您的代码中,您尝试从根生存期范围而不是嵌套的“每个请求”生存期范围解析服务。

如果要在不运行应用程序的情况下测试解决服务的问题,则需要使用与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请求可用时,这在单元测试中很有用。

07-27 16:19