我正在尝试在以下实现中使用我的 UnitOfWorkIAuthorizationFilter
,但是在我在几页之间导航后,我得到了这个异常:
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>();
}
}
权限过滤器.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
and InRequestScope
无济于事。因此,不会检索数据库的更新,而是我的 UnitOfWork 始终返回相同的数据。
我读过很多关于DbContext has been disposed
但他们都没有实施IAuthorizationFilter
.
解决这个问题的最佳方法是什么?我想避免new
or using()
在过滤器内或使用服务定位器模式。
您的问题来自这样一个事实:您的 MyContext 是在请求范围内实例化并在请求结束时处置的。
为了解决这个问题,避免new()
, using
或 ServiceLocator 模式,您可以依赖专用的IFilterProvider
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 Factory 扩展,例如Ninject.Extensions.Factory https://www.nuget.org/packages/Ninject.Extensions.Factory/达到Func<PermissionFilter>
工厂模式在PermissionFilterProvider
构造函数。
另外,我不确定你的范围IUnitOfWork
。不应该和你的一样吗MyContext
?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)