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에 있어야합니다.