首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IAuthorizationFilter与DbContext和EF一起处理错误

使用IAuthorizationFilter与DbContext和EF一起处理错误
EN

Stack Overflow用户
提问于 2016-02-01 03:23:25
回答 1查看 369关注 0票数 4

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

System.InvalidOperationException:由于DbContext已被释放,操作无法完成。

FilterConfig.cs

代码语言:javascript
复制
filters.Add(DependencyResolver.Current.GetService(typeof(PermissionFilter)));

NinjectMappings.cs

代码语言:javascript
复制
public class NinjectMappings : NinjectModule
{
    public override void Load()
    {
        Bind<MyContext>().ToSelf().InRequestScope();
        Bind<IUnitOfWork>().To<UnitOfWork>();
    }
}

PermissionFilter.cs

代码语言:javascript
复制
public class PermissionFilter : IAuthorizationFilter
{
    public PermissionFilter(IUnitOfWork unitOfWork)
    {
        // etc...
    }
}

我可以用:

代码语言:javascript
复制
// 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(),或者使用Service模式。

EN

回答 1

Stack Overflow用户

发布于 2016-02-02 21:44:25

您的问题来自这样一个事实:您的MyContext在请求的范围内实例化,并在请求的末尾被释放。

要解决这个问题,您可以使用专用的new()using或ServiceLocator模式来解决这个问题。

代码语言:javascript
复制
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;
    }
}

然后,您的绑定将是:

代码语言:javascript
复制
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一样吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35122561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档