.net 使用Ninject throw在RequestScope中创建My DbContext:“;无法完成该操作,因为DbContext已被释放;

.net 使用Ninject throw在RequestScope中创建My DbContext:“;无法完成该操作,因为DbContext已被释放;,.net,ninject,action-filter,.net,Ninject,Action Filter,我有一个过滤器和过滤器提供程序,设置方式如下: public class AuditoriaFilter : IActionFilter { #region Fields private readonly IRegistrarAuditoriaService _registrarAuditoriaService; private readonly IUsuarioRepository _usuarioRepository; private readonly

我有一个过滤器和过滤器提供程序,设置方式如下:

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)
    {
    }
}
筛选器提供程序:

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;
    }
}
如果我将
DbContext
放在
InSingletonScope()
中,所有的工作都正常,但是
DbContext
不能留在SingletonScope中,它必须在RequestScope中


当DbContext在RequestScope中时,所有依赖于DbContext的控制器都可以正常工作,但当.Net需要使用筛选器时,它只在第一个请求上工作,在第二个请求上会引发异常:“由于DbContext已被释放,操作无法完成。”

不是为每个请求都创建筛选器提供程序,因此不允许在请求范围中获取任何依赖项

改用

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);
}
public override void Load()
{
    Bind<IDbContext>().To<DbContext>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.AppSettings["DefaultConnectionString"]);
}