Ответ заключался в создании экземпляра класса, реализующего IDependencyScope, из метода BeginScope () в DependencyResolver.Это предотвращает добавление нового указателя в коллекцию Disposables и тем самым устраняет утечку памяти.
/// <inheritdoc />
public class DefaultDependencyResolver : IDependencyResolver
{
private readonly IServiceProvider _serviceProvider;
/// <inheritdoc />
public DefaultDependencyResolver(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
/// <inheritdoc />
public object GetService(Type serviceType)
{
return _serviceProvider.GetService(serviceType);
}
/// <inheritdoc />
public IEnumerable<object> GetServices(Type serviceType)
{
return _serviceProvider.GetServices(serviceType);
}
/// <inheritdoc />
public IDependencyScope BeginScope()
{
return new DefaultDependencyScope(_serviceProvider.CreateScope());
}
/// <inheritdoc />
public void Dispose()
{
//No-op
}
}
/// <inheritdoc />
public class DefaultDependencyScope : IDependencyScope
{
private readonly IServiceScope _serviceScope;
/// <inheritdoc />
public DefaultDependencyScope(IServiceScope serviceScope)
{
_serviceScope = serviceScope;
}
/// <inheritdoc />
public void Dispose()
{
_serviceScope.Dispose();
}
/// <inheritdoc />
public object GetService(Type serviceType)
{
return _serviceScope.ServiceProvider.GetService(serviceType);
}
/// <inheritdoc />
public IEnumerable<object> GetServices(Type serviceType)
{
return _serviceScope.ServiceProvider.GetServices(serviceType);
}
}
, а затем регистрирует преобразователь зависимостей из конфигурации API
//Register controllers with container
foreach (var type in typeof(WebApiConfig).Assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
.Where(t => typeof(ApiController).IsAssignableFrom(t)))
{
services.AddTransient(type);
}
//Link DI in application to container
var provider = services.BuildServiceProvider();
config.DependencyResolver = new DefaultDependencyResolver(provider);
В моем случаеМне не нужно регистрировать какие-либо зависимости как синглтоны.Если это требуется, может потребоваться дополнительный код для условного возврата области видимости, основанной на типе.