首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RequestScope抛出的RequestScope:“操作无法完成,因为DbContext已被释放。”

使用RequestScope抛出的RequestScope:“操作无法完成,因为DbContext已被释放。”
EN

Stack Overflow用户
提问于 2011-10-19 16:43:55
回答 1查看 2.5K关注 0票数 1

我有一个过滤器和一个过滤器提供程序是这样设置的:

代码语言:javascript
复制
public class AuditoriaFilter : IActionFilter
{
    #region Fields

    private readonly IRegistrarAuditoriaService _registrarAuditoriaService;

    private readonly IUsuarioRepository _usuarioRepository;

    private readonly ISiteRepository _siteRepository;

    private readonly IModuloRepository _moduloRepository;

    private readonly IAtividadeRepository _atividadeRepository;

    #endregion

    #region Constructors

    public AuditoriaFilter(IRegistrarAuditoriaService registrarAuditoriaService, IUsuarioRepository usuarioRepository, ISiteRepository siteRepository, IModuloRepository moduloRepository, IAtividadeRepository atividadeRepository)
    {
        this._registrarAuditoriaService = registrarAuditoriaService;
        this._usuarioRepository = usuarioRepository;
        this._siteRepository = siteRepository;
        this._moduloRepository = moduloRepository;
        this._atividadeRepository = atividadeRepository;
    }

    #endregion

    public void OnActionExecuted(ActionExecutedContext context)
    {
        Usuario usuario = _usuarioRepository.GetById(1);

        Site site = _siteRepository.GetById(1);

        Modulo modulo = _moduloRepository.GetById(1);

        Atividade atividade = _atividadeRepository.GetById(1);

        _registrarAuditoriaService.Registrar(usuario, site, modulo, atividade);
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

过滤器提供者:

代码语言:javascript
复制
public class AuditoriaFilterProvider : IFilterProvider
{
    #region Fields

    private readonly IRegistrarAuditoriaService _registrarAuditoriaService;

    private readonly IUsuarioRepository _usuarioRepository;

    private readonly ISiteRepository _siteRepository;

    private readonly IModuloRepository _moduloRepository;

    private readonly IAtividadeRepository _atividadeRepository;

    #endregion

    #region Constructors

    public AuditoriaFilterProvider(IRegistrarAuditoriaService registrarAuditoriaService, IUsuarioRepository usuarioRepository, ISiteRepository siteRepository, IModuloRepository moduloRepository, IAtividadeRepository atividadeRepository)
    {
        this._registrarAuditoriaService = registrarAuditoriaService;
        this._usuarioRepository = usuarioRepository;
        this._siteRepository = siteRepository;
        this._moduloRepository = moduloRepository;
        this._atividadeRepository = atividadeRepository;
    }

    #endregion

    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        bool postHttpMethod = controllerContext.RequestContext.HttpContext.Request.HttpMethod.ToUpper() == "POST";
        string controllerName = actionDescriptor.ControllerDescriptor.ControllerName;

        if (postHttpMethod && controllerName != "Login")
            yield return new Filter(new AuditoriaFilter(_registrarAuditoriaService, _usuarioRepository, _siteRepository, _moduloRepository, _atividadeRepository), FilterScope.Action, null);

        yield break;
    }
}

Global.asax:

代码语言:javascript
复制
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    AuditoriaFilterProvider auditoriaFilterProvider = new AuditoriaFilterProvider(DependencyResolver.Get<IRegistrarAuditoriaService>(), DependencyResolver.Get<IUsuarioRepository>(), DependencyResolver.Get<ISiteRepository>(), DependencyResolver.Get<IModuloRepository>(), DependencyResolver.Get<IAtividadeRepository>());

    FilterProviders.Providers.Add(auditoriaFilterProvider);
}

我所有的only设置都是相同的,而且都是可以的,只有DbContext是不同的:它是InRequestScope()

代码语言:javascript
复制
public override void Load()
{
    Bind<IDbContext>().To<DbContext>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.AppSettings["DefaultConnectionString"]);
}

如果我把DbContext放在InSingletonScope()中,一切正常,但是DbContext不能呆在SingletonScope,它必须在RequestScope中。

当DbContext是InRequestScope时,所有依赖于InRequestScope的控制器都能正常工作,但是当有时间使用过滤器时,它只对第一个请求起作用,对于第二个请求,抛出一个异常::“由于DbContext已被释放,操作无法完成”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-20 10:12:33

过滤器提供程序并不是为每个请求创建的,因此不允许在请求范围内获得任何依赖项。

使用https://github.com/ninject/ninject.web.mvc/wiki/Dependency-injection-for-filters代替。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7824891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档