Bre*_*ogt 14 c# dependency-injection autofac asp.net-mvc-3
我在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>();
Run Code Online (Sandbox Code Playgroud)
WebWorkContext 类:
public class WebWorkContext : IWorkContext
{
// Left out other code
}
Run Code Online (Sandbox Code Playgroud)
IWorkContext 接口:
public interface IWorkContext
{
// Left out other code
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
从请求实例的作用域中看不到具有匹配"httpRequest"的标记的作用域.这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似场景)重新请求.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.
我如何让它工作?我之所以这么想是因为工作上下文处理诸如获取当前客户等内容.
还有一些问题.一次注册是否明智/最佳做法?我需要在另一个阶段添加更多组件吗?
Ale*_*ves 22
标记的注册InstancePerHttpRequest应该从每个HTTP请求期间创建和处置的特定嵌套生命周期范围中解析.
如果将IWorkContext构造函数参数添加到其中一个控制器,则会发现注入了一个实例.在您的代码中,您尝试从根生命周期范围而不是嵌套的"每个请求"生命周期范围中解析您的服务.
如果要在不运行应用程序的情况下测试解析服务,则需要使用与HTTP请求期间创建的标记相同的标记创建生命周期范围.在MVC 3集成中,生命周期范围被标记为"httpRequest".
using (var httpRequestScope = container.BeginLifetimeScope("httpRequest"))
{
Assert.That(httpRequestScope.Resolve<IWorkContext>(), Is.Not.Null);
}
Run Code Online (Sandbox Code Playgroud)
我想我将更新MVC集成以通过API公开公开"httpRequest"标记名称,以便字符串值不需要硬编码.也可以将自己的ILifetimeScopeProvider实现传递给它,AutofacDependencyResolver以便您可以控制ASP.NET运行时之外的生命周期范围的创建.当没有可用的HTTP请求时,这在单元测试中很有用.
| 归档时间: |
|
| 查看次数: |
13149 次 |
| 最近记录: |