2011-10-19 4 views
1

그런 식으로 필터 및 필터 공급자를 설정했습니다.Ninject 던져 사용하여 RequestScope 내 DbContext : "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 설정은 같은 방식입니다. InRequestScope() : 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 override void Load() 
{ 
    Bind<IDbContext>().To<DbContext>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.AppSettings["DefaultConnectionString"]); 
} 

InSingletonScope()InSingletonScope()에 넣으면 모든 것이 정상적으로 작동하지만 DbContext는 SingletonScope에 남아있을 수 없으므로 RequestScope에 있어야합니다.

DbContext에 의존하는 모든 컨트롤러는 DbContext가 InRequestScope 일 때 제대로 작동하지만 .Net을 사용할 때 첫 번째 요청에서만 작동합니다. 두 번째 요청에서 예외가 발생합니다. "작업을 수행 할 수 없습니다. DbContext가 삭제 되었기 때문에 완료되었습니다. "

답변