1

我正在尝试解决我的应用程序中的 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+<>c__DisplayClass0[...]).lifetimeScopeTag.Equals(scope.Tag)' 匹配的范围。

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

4

2 回答 2

1

您的设置看起来不错 - 我猜问题是您正在尝试从 IContainerProvider.ApplicationContainer 解析 AccountController(手动?)。

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

您是否尝试过 Autofac ASP.NET MVC 集成?它会为你解决这个问题。

于 2010-04-20T20:27:01.730 回答
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();
}
于 2010-10-26T15:50:29.210 回答