2011-10-19 38 views
1

我有一個過濾器和過濾器提供商以這種方式設置:我在RequestScope的DbContext使用Ninject扔:「因爲在的DbContext已配置的操作無法完成」

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

如果我把DbContextInSingletonScope()所有工作正常,但DbContext不能留在SingletonScope,它必須是在RequestScope。

所有控制器都依賴於的DbContext正常工作時的DbContext是InRequestScope,但是當是時候.NET中使用第二請求的例外是把它僅適用於第一個請求的過濾器,:「的操作不能由於完成了的DbContext已設置。」

回答

相關問題