首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个请求的新IAuthorizationFilter实例

每个请求的新IAuthorizationFilter实例
EN

Stack Overflow用户
提问于 2015-10-28 11:38:10
回答 1查看 395关注 0票数 0

在我开始在过滤器中使用DI之后,我将得到下一个EF异常:

在以前的异步操作完成之前,在此上下文上启动了第二个操作。在此上下文中调用另一个方法之前,请使用“等待”确保任何异步操作都已完成。不保证任何实例成员都是线程安全的。

我使用Unity作为我的IoC容器。我的设置如下:

代码语言:javascript
复制
config.DependencyResolver = new UnityHierarchicalDependencyResolver(container);

var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();

//adding IFilterProvider provided by Unity
GlobalConfiguration.Configuration.Services.Add(
    typeof(IFilterProvider),
    new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));

var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);

//removing default IFilterProvider
GlobalConfiguration.Configuration.Services.Remove(
    typeof(IFilterProvider),
    defaultprovider);

然后,我将我的过滤器注册为授权,如下所示:

代码语言:javascript
复制
var authFilter = config.DependencyResolver.GetService(typeof(MyFilterType));
config.Filters.Add((MyFilterType)authFilter);

我的授权过滤器如下所示:

代码语言:javascript
复制
public class MyFilterType : IAuthorizationFilter
{
    private readonly MyServiceInterfaceType _service;

    public MyFilterType(MyServiceInterfaceType service)
    {
        _service = service;
    }

    public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext,
        CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        var res = await _service.SomeAction();

        //the rest doesn't matter
    }
}

MyServiceInterfaceType内部聚合MyRepositoryInterfaceType。所以这只是通常的Service-Repository模式。在MyRepositoryInterfaceType内部初始化EF上下文。

所以关于例外。我知道这意味着什么--对上下文有并发异步调用。我想是因为这两句话:

代码语言:javascript
复制
var authFilter = config.DependencyResolver.GetService(typeof(MyFilterType));
config.Filters.Add((MyFilterType)authFilter);

过滤器实例基本上存储在单例中。因此,每个过滤器调用都由相同的EF上下文实例提供服务,这就是为什么存在异常。

(如果这件事出了问题,请纠正我。)

,我的问题是:是否可以为每个调用创建新的MyFilterType过滤器实例以避免这些异常?

EN

回答 1

Stack Overflow用户

发布于 2015-10-28 11:43:55

您需要在方法中进行服务定位。

代码语言:javascript
复制
var requestScope = actionContext.Request.GetDependencyScope();
var myService = requestScope.GetService(MyServiceInterfaceType) as MyServiceInterfaceType;

Autofac有自己的过滤器,如果你使用它而不是团结,你可以使用它,但我不认为团结提供了类似的东西。Autofac文档很好地解释了这种情况:http://docs.autofac.org/en/latest/integration/webapi.html#provide-filters-via-dependency-injection

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

https://stackoverflow.com/questions/33390047

复制
相关文章

相似问题

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