gpt4 book ai didi

c# - 将 IAuthorizationFilter 与 Ninject 和 EF 一起使用会给出 DbContext has been disposed 错误

转载 作者:行者123 更新时间:2023-11-30 12:42:02 31 4
gpt4 key购买 nike

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

System.InvalidOperationException: The operation cannot be completed because the DbContext has been disposed.

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 只在应用程序启动时被调用一次。我尝试在 InTransientScopeInRequestScope 之间交替,但无济于事。因此不会检索到数据库的更新,而是我的 UnitOfWork 总是返回相同的数据。

我已经阅读了很多关于 DbContext has been disposed 的问题,但没有一个是在实现 IAuthorizationFilter

解决这个问题的最佳方法是什么?我想避免在过滤器内使用 newusing() 或使用服务定位器模式。

最佳答案

您的问题来自于您的 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;
}
}

您的绑定(bind)将是:

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实现Func<PermissionFilter> PermissionFilterProvider中的工厂模式构造函数。

此外,我不确定您的 IUnitOfWork 的范围.它不应该和你的MyContext一样吗? ?

关于c# - 将 IAuthorizationFilter 与 Ninject 和 EF 一起使用会给出 DbContext has been disposed 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35122561/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com