使用IAuthorizationFilter和Ninject和EF给DbContext配置错误

我正在尝试在IAuthorizationFilter的实现中使用我的UnitOfWork,但在我在几个页面之间导航后,我得到了这个exception:

System.InvalidOperationException:无法完成操作,因为已释放DbContext。

FilterConfig.cs

 filters.Add(DependencyResolver.Current.GetService(typeof(PermissionFilter))); 

NinjectMappings.cs

 public class NinjectMappings : NinjectModule { public override void Load() { Bind().ToSelf().InRequestScope(); Bind().To(); } } 

PermissionFilter.cs

 public class PermissionFilter : IAuthorizationFilter { public PermissionFilter(IUnitOfWork unitOfWork) { // etc... } } 

我能够解决这个问题:

 // NinjectMappings Bind() .ToMethod(m => GetUnitOfWork()) .WhenInjectedExactlyInto(typeof(PermissionFilter)); private IUnitOfWork GetUnitOfWork() { return new UnitOfWork(new MyContext()); } 

现在的问题是GetUnitOfWork只在应用启动时调用一次。 我尝试在InTransientScopeInRequestScope之间交替无效。 因此,不会检索数据库的更新,而是我的UnitOfWork始终返回相同的数据。

我已经阅读了很多处理DbContext has been disposed问题,但是他们都没有实现IAuthorizationFilter

解决这个问题的最佳方法是什么? 我想在filter内部using() newusing()或使用Service Locator模式。

您的问题来自于MyContext在请求范围内实例化并在请求结束时处理。

要解决此问题,请避免使用new()using或ServiceLocator模式,您可以依赖专用的IFilterProvider

 public class PermissionFilterProvider : IFilterProvider { private readonly Func _permissionFilterFactory = null; public PermissionFilterProvider(Func filterFactory) { _permissionFilterFactory = filterFactory; } public IEnumerable GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var filters = new List(); // instantiate PermissionFilter action filter filters.Add(new Filter(_permissionFilterFactory(), FilterScope.Action, 0)); return filters; } } 

你的绑定将是:

 public class NinjectMappings : NinjectModule { public override void Load() { Bind().ToSelf().InRequestScope(); Bind().To(); Bind().To(); Bind().ToSelf(); } } 

请注意,您需要一个Ninject Factory扩展,如Ninject.Extensions.Factory,以在PermissionFilterProvider构造函数中实现Func工厂模式。

另外,我不确定您的IUnitOfWork的范围。 它不应该与你的MyContext相同吗?