Browse Source

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

pull/773/head
Kévin Chalet 7 years ago
committed by GitHub
parent
commit
32a51c026b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  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. 5
      src/OpenIddict.NHibernate/OpenIddictNHibernateExtensions.cs
  12. 17
      src/OpenIddict.NHibernate/Resolvers/OpenIddictApplicationStoreResolver.cs
  13. 17
      src/OpenIddict.NHibernate/Resolvers/OpenIddictAuthorizationStoreResolver.cs
  14. 17
      src/OpenIddict.NHibernate/Resolvers/OpenIddictScopeStoreResolver.cs
  15. 17
      src/OpenIddict.NHibernate/Resolvers/OpenIddictTokenStoreResolver.cs
  16. 19
      test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs
  17. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs
  18. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs
  19. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs
  20. 9
      test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs
  21. 19
      test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs
  22. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs
  23. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs
  24. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs
  25. 9
      test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs
  26. 19
      test/OpenIddict.NHibernate.Tests/OpenIddictNHibernateExtensionsTests.cs
  27. 7
      test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs
  28. 7
      test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs
  29. 7
      test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs
  30. 7
      test/OpenIddict.NHibernate.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

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

5
src/OpenIddict.NHibernate/OpenIddictNHibernateExtensions.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<,>));

17
src/OpenIddict.NHibernate/Resolvers/OpenIddictApplicationStoreResolver.cs

@ -20,11 +20,16 @@ namespace OpenIddict.NHibernate
/// </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 IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictApplicationStoreResolver([NotNull] IServiceProvider provider) public OpenIddictApplicationStoreResolver(
=> _provider = provider; [NotNull] TypeResolutionCache cache,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_provider = provider;
}
/// <summary> /// <summary>
/// Returns an application store compatible with the specified application type or throws an /// Returns an application store compatible with the specified application type or throws an
@ -62,5 +67,11 @@ namespace OpenIddict.NHibernate
return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type); return (IOpenIddictApplicationStore<TApplication>) _provider.GetRequiredService(type);
} }
// Note: NHibernate 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> { }
} }
} }

17
src/OpenIddict.NHibernate/Resolvers/OpenIddictAuthorizationStoreResolver.cs

@ -20,11 +20,16 @@ namespace OpenIddict.NHibernate
/// </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 IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictAuthorizationStoreResolver([NotNull] IServiceProvider provider) public OpenIddictAuthorizationStoreResolver(
=> _provider = provider; [NotNull] TypeResolutionCache cache,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_provider = provider;
}
/// <summary> /// <summary>
/// Returns an authorization store compatible with the specified authorization type or throws an /// Returns an authorization store compatible with the specified authorization type or throws an
@ -62,5 +67,11 @@ namespace OpenIddict.NHibernate
return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type); return (IOpenIddictAuthorizationStore<TAuthorization>) _provider.GetRequiredService(type);
} }
// Note: NHibernate 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> { }
} }
} }

17
src/OpenIddict.NHibernate/Resolvers/OpenIddictScopeStoreResolver.cs

@ -20,11 +20,16 @@ namespace OpenIddict.NHibernate
/// </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 IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictScopeStoreResolver([NotNull] IServiceProvider provider) public OpenIddictScopeStoreResolver(
=> _provider = provider; [NotNull] TypeResolutionCache cache,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_provider = provider;
}
/// <summary> /// <summary>
/// Returns a scope store compatible with the specified scope type or throws an /// Returns a scope store compatible with the specified scope type or throws an
@ -60,5 +65,11 @@ namespace OpenIddict.NHibernate
return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type); return (IOpenIddictScopeStore<TScope>) _provider.GetRequiredService(type);
} }
// Note: NHibernate 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> { }
} }
} }

17
src/OpenIddict.NHibernate/Resolvers/OpenIddictTokenStoreResolver.cs

@ -20,11 +20,16 @@ namespace OpenIddict.NHibernate
/// </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 IServiceProvider _provider; private readonly IServiceProvider _provider;
public OpenIddictTokenStoreResolver([NotNull] IServiceProvider provider) public OpenIddictTokenStoreResolver(
=> _provider = provider; [NotNull] TypeResolutionCache cache,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_provider = provider;
}
/// <summary> /// <summary>
/// Returns a token store compatible with the specified token type or throws an /// Returns a token store compatible with the specified token type or throws an
@ -62,5 +67,11 @@ namespace OpenIddict.NHibernate
return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type); return (IOpenIddictTokenStore<TToken>) _provider.GetRequiredService(type);
} }
// Note: NHibernate 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

@ -80,6 +80,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

@ -80,6 +80,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>());

19
test/OpenIddict.NHibernate.Tests/OpenIddictNHibernateExtensionsTests.cs

@ -80,6 +80,25 @@ namespace OpenIddict.NHibernate.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_RegistersNHibernateStoreResolverCaches(Type type)
{
// Arrange
var services = new ServiceCollection();
var builder = new OpenIddictCoreBuilder(services);
// Act
builder.UseNHibernate();
// 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<,,,>))]

7
test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs

@ -13,6 +13,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.NHibernate.Models; using OpenIddict.NHibernate.Models;
using Xunit; using Xunit;
using static OpenIddict.NHibernate.OpenIddictApplicationStoreResolver;
namespace OpenIddict.NHibernate.Tests namespace OpenIddict.NHibernate.Tests
{ {
@ -26,7 +27,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(Mock.Of<IOpenIddictApplicationStore<CustomApplication>>()); services.AddSingleton(Mock.Of<IOpenIddictApplicationStore<CustomApplication>>());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomApplication>()); Assert.NotNull(resolver.Get<CustomApplication>());
@ -39,7 +40,7 @@ namespace OpenIddict.NHibernate.Tests
var services = new ServiceCollection(); var services = new ServiceCollection();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomApplication>());
@ -61,7 +62,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(CreateStore()); services.AddSingleton(CreateStore());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictApplicationStoreResolver(provider); var resolver = new OpenIddictApplicationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyApplication>()); Assert.NotNull(resolver.Get<MyApplication>());

7
test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs

@ -13,6 +13,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.NHibernate.Models; using OpenIddict.NHibernate.Models;
using Xunit; using Xunit;
using static OpenIddict.NHibernate.OpenIddictAuthorizationStoreResolver;
namespace OpenIddict.NHibernate.Tests namespace OpenIddict.NHibernate.Tests
{ {
@ -26,7 +27,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(Mock.Of<IOpenIddictAuthorizationStore<CustomAuthorization>>()); services.AddSingleton(Mock.Of<IOpenIddictAuthorizationStore<CustomAuthorization>>());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomAuthorization>()); Assert.NotNull(resolver.Get<CustomAuthorization>());
@ -39,7 +40,7 @@ namespace OpenIddict.NHibernate.Tests
var services = new ServiceCollection(); var services = new ServiceCollection();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomAuthorization>());
@ -61,7 +62,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(CreateStore()); services.AddSingleton(CreateStore());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictAuthorizationStoreResolver(provider); var resolver = new OpenIddictAuthorizationStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyAuthorization>()); Assert.NotNull(resolver.Get<MyAuthorization>());

7
test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs

@ -13,6 +13,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.NHibernate.Models; using OpenIddict.NHibernate.Models;
using Xunit; using Xunit;
using static OpenIddict.NHibernate.OpenIddictScopeStoreResolver;
namespace OpenIddict.NHibernate.Tests namespace OpenIddict.NHibernate.Tests
{ {
@ -26,7 +27,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(Mock.Of<IOpenIddictScopeStore<CustomScope>>()); services.AddSingleton(Mock.Of<IOpenIddictScopeStore<CustomScope>>());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomScope>()); Assert.NotNull(resolver.Get<CustomScope>());
@ -39,7 +40,7 @@ namespace OpenIddict.NHibernate.Tests
var services = new ServiceCollection(); var services = new ServiceCollection();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomScope>());
@ -61,7 +62,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(CreateStore()); services.AddSingleton(CreateStore());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictScopeStoreResolver(provider); var resolver = new OpenIddictScopeStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyScope>()); Assert.NotNull(resolver.Get<MyScope>());

7
test/OpenIddict.NHibernate.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs

@ -13,6 +13,7 @@ using Moq;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.NHibernate.Models; using OpenIddict.NHibernate.Models;
using Xunit; using Xunit;
using static OpenIddict.NHibernate.OpenIddictTokenStoreResolver;
namespace OpenIddict.NHibernate.Tests namespace OpenIddict.NHibernate.Tests
{ {
@ -26,7 +27,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(Mock.Of<IOpenIddictTokenStore<CustomToken>>()); services.AddSingleton(Mock.Of<IOpenIddictTokenStore<CustomToken>>());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<CustomToken>()); Assert.NotNull(resolver.Get<CustomToken>());
@ -39,7 +40,7 @@ namespace OpenIddict.NHibernate.Tests
var services = new ServiceCollection(); var services = new ServiceCollection();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>()); var exception = Assert.Throws<InvalidOperationException>(() => resolver.Get<CustomToken>());
@ -61,7 +62,7 @@ namespace OpenIddict.NHibernate.Tests
services.AddSingleton(CreateStore()); services.AddSingleton(CreateStore());
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
var resolver = new OpenIddictTokenStoreResolver(provider); var resolver = new OpenIddictTokenStoreResolver(new TypeResolutionCache(), provider);
// Act and assert // Act and assert
Assert.NotNull(resolver.Get<MyToken>()); Assert.NotNull(resolver.Get<MyToken>());

Loading…
Cancel
Save