4

假设我有一个注册为 HttpRequestScoped 的依赖项,因此每个请求只有一个实例。如何解决 HttpRequest 之外的相同类型的依赖项?

例如:

// Global.asax.cs Registration
builder.Register(c => new MyDataContext(connString)).As<IDatabase>().HttpRequestScoped();
_containerProvider = new ContainerProvider(builder.Build());

// This event handler gets fired outside of a request
// when a cached item is removed from the cache.
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // I'm trying to resolve like so, but this doesn't work...
    var dataContext = _containerProvider.ApplicationContainer.Resolve<IDatabase>();
    // Do stuff with data context.
}

上面的代码在执行 CacheItemRemoved 处理程序时会抛出 DependencyResolutionException:

没有与表达式匹配的范围 'value(Autofac.Builder.RegistrationBuilder`3+<>c__DisplayClass0[MyApp.Core.Data.MyDataContext,Autofac.Builder.SimpleActivatorData,Autofac.Builder.SingleRegistrationStyle]).lifetimeScopeTag.Equals(scope.Tag) ' 在请求实例的范围内可见。

4

1 回答 1

3

InstancePerLifetimeScope(), 而不是HttpRequestScoped(), 会给出你需要的结果。

但是有一个警告 - 如果IDatabase需要处置,或者依赖于需要处置的东西,如果您从 ApplicationContainer 解决它,则不会发生这种情况。更好的做法:

using (var cacheRemovalScope =
        _containerProvider.ApplicationContainer.BeginLifetimeScope())
{
    var dataContext = cacheRemovalScope.Resolve<IDatabase>();
    // Do what y' gotta do...
}
于 2010-06-11T04:08:40.530 回答