我已经在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请求可用时,这在单元测试中很有用。