Мой DbContext в RequestScope с использованием Ninject throw: «Операция не может быть завершена, потому что DbContext был удален». - PullRequest
1 голос
/ 19 октября 2011

У меня есть фильтр и поставщик фильтров, установленные таким образом:

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;
    }
}

Global.asax:

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);
}

Все мои настройки Ninject одинаковы и в порядке, только DbContext отличается: это InRequestScope():

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

Если я поставлю DbContext в InSingletonScope(), все работает нормально,но DbContext не может оставаться в SingletonScope, он должен быть в RequestScope.

Все контроллеры, зависящие от DbContext, прекрасно работают, когда DbContext имеет значение InRequestScope, но когда .Net использует фильтр, он работает только напервый запрос, для второго запроса выбрасывается исключение: «Операция не может быть завершена, поскольку DbContext the был удален.»

1 Ответ

2 голосов
/ 20 октября 2011

Поставщики фильтров не создаются для каждого запроса, и поэтому им не разрешено получать какие-либо зависимости в области действия запроса.

Используйте https://github.com/ninject/ninject.web.mvc/wiki/Dependency-injection-for-filters вместо.

...