我试图在IAuthorizationFilter的实现中使用我的IAuthorizationFilter,但是在几个页面之间导航之后,我得到了这个异常:
System.InvalidOperationException:由于DbContext已被释放,操作无法完成。
FilterConfig.cs
filters.Add(DependencyResolver.Current.GetService(typeof(PermissionFilter)));NinjectMappings.cs
public class NinjectMappings : NinjectModule
{
public override void Load()
{
Bind<MyContext>().ToSelf().InRequestScope();
Bind<IUnitOfWork>().To<UnitOfWork>();
}
}PermissionFilter.cs
public class PermissionFilter : IAuthorizationFilter
{
public PermissionFilter(IUnitOfWork unitOfWork)
{
// etc...
}
}我可以用:
// NinjectMappings
Bind<IUnitOfWork>()
.ToMethod(m => GetUnitOfWork())
.WhenInjectedExactlyInto(typeof(PermissionFilter));
private IUnitOfWork GetUnitOfWork()
{
return new UnitOfWork(new MyContext());
}现在的问题是,在应用程序启动时,GetUnitOfWork只被调用一次。我试着在InTransientScope和InRequestScope之间交替使用,但没有结果。因此,不会检索数据库的更新,相反,我的UnitOfWork总是返回相同的数据。
我读过很多关于DbContext has been disposed的问题,但是没有一个是实现IAuthorizationFilter的。
解决这个问题的最好方法是什么?我想避免在过滤器中使用new或using(),或者使用Service模式。
发布于 2016-02-02 21:44:25
您的问题来自这样一个事实:您的MyContext在请求的范围内实例化,并在请求的末尾被释放。
要解决这个问题,您可以使用专用的new()、using或ServiceLocator模式来解决这个问题。
public class PermissionFilterProvider : IFilterProvider
{
private readonly Func<PermissionFilter> _permissionFilterFactory = null;
public PermissionFilterProvider(Func<PermissionFilter> filterFactory)
{
_permissionFilterFactory = filterFactory;
}
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var filters = new List<Filter>();
// instantiate PermissionFilter action filter
filters.Add(new Filter(_permissionFilterFactory(), FilterScope.Action, 0));
return filters;
}
}然后,您的绑定将是:
public class NinjectMappings : NinjectModule
{
public override void Load()
{
Bind<MyContext>().ToSelf().InRequestScope();
Bind<IUnitOfWork>().To<UnitOfWork>();
Bind<IFilterProvider>().To<PermissionFilterProvider>();
Bind<PermissionFilter>().ToSelf();
}
}请注意,您将需要像Ninject.Extensions.Factory这样的Ninject扩展来实现PermissionFilterProvider构造函数中的Func<PermissionFilter>工厂模式。
此外,我也不确定您的IUnitOfWork的范围。它不应该和你的MyContext一样吗?
https://stackoverflow.com/questions/35122561
复制相似问题