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>()
.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(OpenIddictAuthorizationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>));

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

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework
/// </summary>
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 IServiceProvider _provider;
public OpenIddictApplicationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
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>
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 IServiceProvider _provider;
public OpenIddictAuthorizationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
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>
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 IServiceProvider _provider;
public OpenIddictScopeStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -78,5 +80,11 @@ namespace OpenIddict.EntityFramework
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>
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 IServiceProvider _provider;
public OpenIddictTokenStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework
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>()
.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(OpenIddictAuthorizationStore<,,,,>));
builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>));

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

@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore
/// </summary>
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 IServiceProvider _provider;
public OpenIddictApplicationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
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>
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 IServiceProvider _provider;
public OpenIddictAuthorizationStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
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>
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 IServiceProvider _provider;
public OpenIddictScopeStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -78,5 +80,11 @@ namespace OpenIddict.EntityFrameworkCore
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>
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 IServiceProvider _provider;
public OpenIddictTokenStoreResolver(
[NotNull] TypeResolutionCache cache,
[NotNull] IOptionsMonitor<OpenIddictEntityFrameworkCoreOptions> options,
[NotNull] IServiceProvider provider)
{
_cache = cache;
_options = options;
_provider = provider;
}
@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore
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);
}
[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]
[InlineData(typeof(OpenIddictApplicationStore<,,,,>))]
[InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))]

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

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

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

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

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

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

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

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

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

@ -81,6 +81,25 @@ namespace OpenIddict.EntityFrameworkCore.Tests
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]
[InlineData(typeof(OpenIddictApplicationStore<,,,,>))]
[InlineData(typeof(OpenIddictAuthorizationStore<,,,,>))]

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

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

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

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

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

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

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

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

Loading…
Cancel
Save