Autofac中HttpRequestScoped的解决问题

时间:2010-04-20 04:17:44

标签: asp.net ioc-container autofac

我正在尝试在我的应用程序中解析AccountController,但似乎我有一个生命周期范围问题。

builder.Register(c => new MyDataContext(connectionString)).As<IDatabase>().HttpRequestScoped();
builder.Register(c => new UnitOfWork(c.Resolve<IDatabase>())).As<IUnitOfWork>().HttpRequestScoped();
builder.Register(c => new AccountService(c.Resolve<IDatabase>())).As<IAccountService>().InstancePerLifetimeScope();
builder.Register(c => new AccountController(c.Resolve<IAccountService>())).InstancePerDependency();

我需要将MyDataContext和UnitOfWork作为HttpRequestLevel的范围。 当我尝试解析AccountController时,出现以下错误:

没有与表达式'value(Autofac.Builder.RegistrationBuilder`3 +&lt;&gt; c__DisplayClass0 [...])匹配的范围.lifeScopeTag.Equals(scope.Tag)'在实例的范围内可见请求。

我的依赖生命周期设置不正确吗?

2 个答案:

答案 0 :(得分:1)

你的设置看起来很好 - 我猜你的问题是你正试图从IContainerProvider.ApplicationContainer解决AccountController(手动?)。

您需要从IContainerProvider.RequestLifetime(1.x中的RequestContainer)解析Web应用程序中的依赖项。

您是否尝试过Autofac ASP.NET MVC集成?它会照顾你。

答案 1 :(得分:0)

我得到了同样的错误。我解决了它将注册指令移到global.asax.cs

中的Application_BeginRequest部分
builder.Register(c => new MyDataContext(connectionString)).As<IDatabase>().SingleInstance();
builder.Register(c => new UnitOfWork(c.Resolve<IDatabase>())).As<IUnitOfWork>().SingleInstance();
builder.Register(c => new AccountService(c.Resolve<IDatabase>())).As<IAccountService>();
builder.Register(c => new AccountController(c.Resolve<IAccountService>())));

然后我处理了容器:

protected void Application_EndRequest()
{
    ContainerProvider.EndRequestLifetime();
}