Using IAuthorizationFilter with Ninject and EF gives DbContext a remote error

I try to use my UnitOfWork inside the implementation IAuthorizationFilter, but after I move between several pages, I get this exception:

System.InvalidOperationException: The operation could not be completed because the DbContext was deleted.

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...
    }
}

I managed to get around this:

// NinjectMappings
Bind<IUnitOfWork>()
    .ToMethod(m => GetUnitOfWork())
    .WhenInjectedExactlyInto(typeof(PermissionFilter));

private IUnitOfWork GetUnitOfWork()
{
    return new UnitOfWork(new MyContext());
}

Now the problem is that it GetUnitOfWorkis called only once, when the application starts. I have tried alternating between InTransientScopeand to InRequestScopeno avail. Therefore, database updates are not retrieved; instead, my UnitOfWork always returns the same data.

, DbContext has been disposed, IAuthorizationFilter.

? new using() Locator .

+4
1

- , 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, Func<PermissionFilter> Factory PermissionFilterProvider .

, IUnitOfWork. , MyContext?

+1

Source: https://habr.com/ru/post/1626808/


All Articles