【问题标题】:Resolving HttpRequestScoped Instances outside of a HttpRequest in Autofac在 Autofac 中解析 HttpRequest 之外的 HttpRequestScoped 实例
【发布时间】:2011-03-01 22:51:10
【问题描述】:

假设我有一个注册为 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)' 在请求实例的范围内可见。

【问题讨论】:

    标签: ioc-container autofac


    【解决方案1】:

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

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

    using (var cacheRemovalScope =
            _containerProvider.ApplicationContainer.BeginLifetimeScope())
    {
        var dataContext = cacheRemovalScope.Resolve<IDatabase>();
        // Do what y' gotta do...
    }
    

    【讨论】:

    • 这可行,但由于某种原因,当我进行此更改时,我的所有更改都不会保留回数据库。
    • 由于您在 HTTP 请求之外,因此您所做的任何请求管道添加都不会被执行;很有可能您需要在某处提交事务。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多