Browse Source

Replace the static caches used in the EF 6/EF Core caches by private singleton caches injected via DI

pull/2236/head
Kévin Chalet 7 years ago
parent
commit
1b03a546c2
  1. 5
      src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs
  2. 10
      src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs
  3. 10
      src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs
  4. 10
      src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs
  5. 10
      src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs
  6. 5
      src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs
  7. 10
      src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs
  8. 10
      src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs
  9. 10
      src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs
  10. 10
      src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs
  11. 19
      test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs
  12. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs
  13. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs
  14. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs
  15. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs
  16. 19
      test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs
  17. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs
  18. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs
  19. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs
  20. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs

5
src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs

@ -46,6 +46,11 @@ namespace Microsoft.Extensions.DependencyInjection
.ReplaceScopeStoreResolver<OpenIddictScopeStoreResolver>() .ReplaceScopeStoreResolver<OpenIddictScopeStoreResolver>()
.ReplaceTokenStoreResolver<OpenIddictTokenStoreResolver>(); .ReplaceTokenStoreResolver<OpenIddictTokenStoreResolver>();
builder.Services.TryAddSingleton<OpenIddictApplicationStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictAuthorizationStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictScopeStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictTokenStoreResolver.TypeResolutionCache>();
builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>)); builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>));

10
src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework
/// </summary> /// </summary>
public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictApplicationStoreResolver( public OpenIddictApplicationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type); return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework
/// </summary> /// </summary>
public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictAuthorizationStoreResolver( public OpenIddictAuthorizationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type); return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework
/// </summary> /// </summary>
public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictScopeStoreResolver( public OpenIddictScopeStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -78,5 +80,11 @@ namespace OpenIddict.EntityFramework
return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type); return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework
/// </summary> /// </summary>
public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictTokenStoreResolver( public OpenIddictTokenStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type); return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

5
src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs

@ -48,6 +48,11 @@ namespace Microsoft.Extensions.DependencyInjection
.ReplaceScopeStoreResolver<OpenIddictScopeStoreResolver>() .ReplaceScopeStoreResolver<OpenIddictScopeStoreResolver>()
.ReplaceTokenStoreResolver<OpenIddictTokenStoreResolver>(); .ReplaceTokenStoreResolver<OpenIddictTokenStoreResolver>();
builder.Services.TryAddSingleton<OpenIddictApplicationStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictAuthorizationStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictScopeStoreResolver.TypeResolutionCache>();
builder.Services.TryAddSingleton<OpenIddictTokenStoreResolver.TypeResolutionCache>();
builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>)); builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>));

10
src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore
/// </summary> /// </summary>
public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictApplicationStoreResolver( public OpenIddictApplicationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type); return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework Core resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore
/// </summary> /// </summary>
public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictAuthorizationStoreResolver( public OpenIddictAuthorizationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type); return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework Core resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore
/// </summary> /// </summary>
public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictScopeStoreResolver( public OpenIddictScopeStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -78,5 +80,11 @@ namespace OpenIddict.EntityFrameworkCore
return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type); return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework Core resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

10
src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore
/// </summary> /// </summary>
public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver
{ {
private static readonly ConcurrentDictionary<Type, Type> _cache = new ConcurrentDictionary<Type, Type>(); private readonly TypeResolutionCache _cache;
private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options; private readonly IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> _options;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictTokenStoreResolver( public OpenIddictTokenStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options, [NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider) [NotNull] IServiceProvider provider)
{ {
_cache = cache;
_options = options; _options = options;
_provider = provider; _provider = provider;
} }
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type); return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type);
} }
// Note: Entity Framework Core resolvers are registered as scoped dependencies as their inner
// service provider must be able to resolve scoped services (typically, the store they return).
// To avoid having to declare a static type resolution cache, a special cache service is used
// here and registered as a singleton dependency so that its content persists beyond the scope.
public class TypeResolutionCache : ConcurrentDictionary<Type, Type> { }
} }
} }

19
test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs

@ -81,6 +81,25 @@ namespace OpenIddict.EntityFramework.Tests
service.ImplementationType == implementationType); service.ImplementationType == implementationType);
} }
[Theory]
[InlineData(typeof(OpenIddictApplicationStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictAuthorizationStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictScopeStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictTokenStoreResolver.TypeResolutionCache))]
public void UseEntityFramework_RegistersEntityFrameworkStoreResolverCaches(Type type)
{
// Arrange
var services = new ServiceCollection();
var builder = new OpenIddictCoreBuilder(services);
// Act
builder.UseEntityFramework();
// Assert
Assert.Contains(services, service => service.ServiceType == type &&
service.ImplementationType == type);
}
[Theory] [Theory]
[InlineData(typeof(OpenIddictApplicationStore<,,,,>))] [InlineData(typeof(OpenIddictApplicationStore<,,,,>))]
[InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))] [InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))]

9
test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFramework.Models; using OpenIddict.EntityFramework.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFramework.OpenIddictApplicationStoreResolver;
namespace OpenIddict.EntityFramework.Tests namespace OpenIddict.EntityFramework.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomApplication>()); Assert.NotNull(resolver.Get<CustomApplication>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictApplication>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictApplication>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyApplication>()); Assert.NotNull(resolver.Get<MyApplication>());

9
test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFramework.Models; using OpenIddict.EntityFramework.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFramework.OpenIddictAuthorizationStoreResolver;
namespace OpenIddict.EntityFramework.Tests namespace OpenIddict.EntityFramework.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomAuthorization>()); Assert.NotNull(resolver.Get<CustomAuthorization>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictAuthorization>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictAuthorization>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyAuthorization>()); Assert.NotNull(resolver.Get<MyAuthorization>());

9
test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFramework.Models; using OpenIddict.EntityFramework.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFramework.OpenIddictScopeStoreResolver;
namespace OpenIddict.EntityFramework.Tests namespace OpenIddict.EntityFramework.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomScope>()); Assert.NotNull(resolver.Get<CustomScope>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictScope>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictScope>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyScope>()); Assert.NotNull(resolver.Get<MyScope>());

9
test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFramework.Models; using OpenIddict.EntityFramework.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFramework.OpenIddictTokenStoreResolver;
namespace OpenIddict.EntityFramework.Tests namespace OpenIddict.EntityFramework.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomToken>()); Assert.NotNull(resolver.Get<CustomToken>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictToken>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictToken>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFramework.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyToken>()); Assert.NotNull(resolver.Get<MyToken>());

19
test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs

@ -81,6 +81,25 @@ namespace OpenIddict.EntityFrameworkCore.Tests
service.ImplementationType == implementationType); service.ImplementationType == implementationType);
} }
[Theory]
[InlineData(typeof(OpenIddictApplicationStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictAuthorizationStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictScopeStoreResolver.TypeResolutionCache))]
[InlineData(typeof(OpenIddictTokenStoreResolver.TypeResolutionCache))]
public void UseEntityFrameworkCore_RegistersEntityFrameworkCoreStoreResolverCaches(Type type)
{
// Arrange
var services = new ServiceCollection();
var builder = new OpenIddictCoreBuilder(services);
// Act
builder.UseEntityFrameworkCore();
// Assert
Assert.Contains(services, service => service.ServiceType == type &&
service.ImplementationType == type);
}
[Theory] [Theory]
[InlineData(typeof(OpenIddictApplicationStore<,,,,>))] [InlineData(typeof(OpenIddictApplicationStore<,,,,>))]
[InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))] [InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))]

9
test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFrameworkCore.Models; using OpenIddict.EntityFrameworkCore.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFrameworkCore.OpenIddictApplicationStoreResolver;
namespace OpenIddict.EntityFrameworkCore.Tests namespace OpenIddict.EntityFrameworkCore.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomApplication>()); Assert.NotNull(resolver.Get<CustomApplication>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictApplication>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictApplication>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(options, provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyApplication>()); Assert.NotNull(resolver.Get<MyApplication>());

9
test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFrameworkCore.Models; using OpenIddict.EntityFrameworkCore.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFrameworkCore.OpenIddictAuthorizationStoreResolver;
namespace OpenIddict.EntityFrameworkCore.Tests namespace OpenIddict.EntityFrameworkCore.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomAuthorization>()); Assert.NotNull(resolver.Get<CustomAuthorization>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictAuthorization>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictAuthorization>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(options, provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyAuthorization>()); Assert.NotNull(resolver.Get<MyAuthorization>());

9
test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFrameworkCore.Models; using OpenIddict.EntityFrameworkCore.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFrameworkCore.OpenIddictScopeStoreResolver;
namespace OpenIddict.EntityFrameworkCore.Tests namespace OpenIddict.EntityFrameworkCore.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomScope>()); Assert.NotNull(resolver.Get<CustomScope>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictScope>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictScope>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(options, provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyScope>()); Assert.NotNull(resolver.Get<MyScope>());

9
test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs

@ -14,6 +14,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.EntityFrameworkCore.Models; using OpenIddict.EntityFrameworkCore.Models;
using Xunit; using Xunit;
using static OpenIddict.EntityFrameworkCore.OpenIddictTokenStoreResolver;
namespace OpenIddict.EntityFrameworkCore.Tests namespace OpenIddict.EntityFrameworkCore.Tests
{ {
@ -28,7 +29,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomToken>()); Assert.NotNull(resolver.Get<CustomToken>());
@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>(); var options = Mock.Of<IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>());
@ -68,7 +69,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictToken>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<OpenIddictToken>());
@ -95,7 +96,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests
}); });
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(options, provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), options, provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyToken>()); Assert.NotNull(resolver.Get<MyToken>());

Loading…
Cancel
Save