使用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
只在应用启动时调用一次。 我尝试在InTransientScope
和InRequestScope
之间交替无效。 因此,不会检索数据库的更新,而是我的UnitOfWork始终返回相同的数据。
我已经阅读了很多处理DbContext has been disposed
问题,但是他们都没有实现IAuthorizationFilter
。
解决这个问题的最佳方法是什么? 我想在filter内部using()
new
或using()
或使用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
相同吗?