我正在尝试在我的应用程序中解析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)'在实例的范围内可见请求。
我的依赖生命周期设置不正确吗?
答案 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();
}