我有一个asp.net MVC网站,它有许多使用InstancePerHttpRequest范围注册的组件,但是我还有一个“后台任务”,它将每隔几个小时运行一次,不会有httpcontext。
我想获得一个我的IRepository实例,它已经像这样注册了
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>))
.InstancePerHttpRequest();
如何使用Autofac从非http上下文中执行此操作?我认为IRepository应该使用InstancePerLifetimeScope
答案 0 :(得分:5)
有几种方法可以做到这一点:
我认为最好的一个。您可以按照说明将存储库注册为InstancePerLifetimeScope。它同样适用于HttpRequests和LifetimeScopes。
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>))
.InstancePerLifetimeScope();
您对HttpRequest的注册可能与LifetimeScope的注册不同,那么您可以有两个单独的注册:
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>))
.WithParameter(...)
.InstancePerHttpRequest(); // will be resolved per HttpRequest
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>))
.InstancePerLifetimeScope(); // will be resolved per LifetimeScope
您可以使用其标记显式创建"HttpRequest"
范围。在新版本中通过MatchingScopeLifetimeTags.RequestLifetimeScopeTag
属性公开。
using (var httpRequestScope = container.BeginLifetimeScope("httpRequest")) // or "AutofacWebRequest" for MVC4/5 integrations
{
var repository = httpRequestScope.Resolve<IRepository<Entity>>();
}