在我开始在过滤器中使用DI之后,我将得到下一个EF异常:
在以前的异步操作完成之前,在此上下文上启动了第二个操作。在此上下文中调用另一个方法之前,请使用“等待”确保任何异步操作都已完成。不保证任何实例成员都是线程安全的。
我使用Unity作为我的IoC容器。我的设置如下:
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);然后,我将我的过滤器注册为授权,如下所示:
var authFilter = config.DependencyResolver.GetService(typeof(MyFilterType));
config.Filters.Add((MyFilterType)authFilter);我的授权过滤器如下所示:
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上下文。
所以关于例外。我知道这意味着什么--对上下文有并发异步调用。我想是因为这两句话:
var authFilter = config.DependencyResolver.GetService(typeof(MyFilterType));
config.Filters.Add((MyFilterType)authFilter);过滤器实例基本上存储在单例中。因此,每个过滤器调用都由相同的EF上下文实例提供服务,这就是为什么存在异常。
(如果这件事出了问题,请纠正我。)
,我的问题是:是否可以为每个调用创建新的MyFilterType过滤器实例以避免这些异常?
发布于 2015-10-28 11:43:55
您需要在方法中进行服务定位。
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
https://stackoverflow.com/questions/33390047
复制相似问题