From 1b03a546c2488cf6c4b02e4769c8669017a5f4c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Sat, 17 Aug 2019 16:44:29 +0200 Subject: [PATCH] Replace the static caches used in the EF 6/EF Core caches by private singleton caches injected via DI --- .../OpenIddictEntityFrameworkExtensions.cs | 5 +++++ .../OpenIddictApplicationStoreResolver.cs | 10 +++++++++- .../OpenIddictAuthorizationStoreResolver.cs | 10 +++++++++- .../Resolvers/OpenIddictScopeStoreResolver.cs | 10 +++++++++- .../Resolvers/OpenIddictTokenStoreResolver.cs | 10 +++++++++- ...OpenIddictEntityFrameworkCoreExtensions.cs | 5 +++++ .../OpenIddictApplicationStoreResolver.cs | 10 +++++++++- .../OpenIddictAuthorizationStoreResolver.cs | 10 +++++++++- .../Resolvers/OpenIddictScopeStoreResolver.cs | 10 +++++++++- .../Resolvers/OpenIddictTokenStoreResolver.cs | 10 +++++++++- ...penIddictEntityFrameworkExtensionsTests.cs | 19 +++++++++++++++++++ ...OpenIddictApplicationStoreResolverTests.cs | 9 +++++---- ...enIddictAuthorizationStoreResolverTests.cs | 9 +++++---- .../OpenIddictScopeStoreResolverTests.cs | 9 +++++---- .../OpenIddictTokenStoreResolverTests.cs | 9 +++++---- ...ddictEntityFrameworkCoreExtensionsTests.cs | 19 +++++++++++++++++++ ...OpenIddictApplicationStoreResolverTests.cs | 9 +++++---- ...enIddictAuthorizationStoreResolverTests.cs | 9 +++++---- .../OpenIddictScopeStoreResolverTests.cs | 9 +++++---- .../OpenIddictTokenStoreResolverTests.cs | 9 +++++---- 20 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs b/src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs index 474b4a9c..f2ed4313 100644 --- a/src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs +++ b/src/OpenIddict.EntityFramework/OpenIddictEntityFrameworkExtensions.cs @@ -46,6 +46,11 @@ namespace Microsoft.Extensions.DependencyInjection .ReplaceScopeStoreResolver() .ReplaceTokenStoreResolver(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>)); diff --git a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs index 044cfa11..05f5491d 100644 --- a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs +++ b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictApplicationStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework /// public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictApplicationStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework return (IOpenIddictApplicationStore) _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 { } } } diff --git a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs index 9683733d..a037d42b 100644 --- a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs +++ b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictAuthorizationStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework /// public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictAuthorizationStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework return (IOpenIddictAuthorizationStore) _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 { } } } diff --git a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs index cfe05634..74ffc732 100644 --- a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs +++ b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictScopeStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework /// public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictScopeStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -78,5 +80,11 @@ namespace OpenIddict.EntityFramework return (IOpenIddictScopeStore) _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 { } } } diff --git a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs index eebd7503..7bd07398 100644 --- a/src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs +++ b/src/OpenIddict.EntityFramework/Resolvers/OpenIddictTokenStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFramework /// public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictTokenStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFramework return (IOpenIddictTokenStore) _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 { } } } diff --git a/src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs b/src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs index 93d9b75d..f93af4f1 100644 --- a/src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs +++ b/src/OpenIddict.EntityFrameworkCore/OpenIddictEntityFrameworkCoreExtensions.cs @@ -48,6 +48,11 @@ namespace Microsoft.Extensions.DependencyInjection .ReplaceScopeStoreResolver() .ReplaceTokenStoreResolver(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddSingleton(); + builder.Services.TryAddScoped(typeof(OpenIddictApplicationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictAuthorizationStore<,,,,>)); builder.Services.TryAddScoped(typeof(OpenIddictScopeStore<,,>)); diff --git a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs index 030a0f2c..4441aafb 100644 --- a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs +++ b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictApplicationStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore /// public class OpenIddictApplicationStoreResolver : IOpenIddictApplicationStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictApplicationStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore return (IOpenIddictApplicationStore) _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 { } } } diff --git a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs index 8964735e..eda0e4d8 100644 --- a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs +++ b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictAuthorizationStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore /// public class OpenIddictAuthorizationStoreResolver : IOpenIddictAuthorizationStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictAuthorizationStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore return (IOpenIddictAuthorizationStore) _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 { } } } diff --git a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs index 9c249b78..ed65f16a 100644 --- a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs +++ b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictScopeStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore /// public class OpenIddictScopeStoreResolver : IOpenIddictScopeStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictScopeStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -78,5 +80,11 @@ namespace OpenIddict.EntityFrameworkCore return (IOpenIddictScopeStore) _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 { } } } diff --git a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs index 860ca846..07c3304a 100644 --- a/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs +++ b/src/OpenIddict.EntityFrameworkCore/Resolvers/OpenIddictTokenStoreResolver.cs @@ -21,14 +21,16 @@ namespace OpenIddict.EntityFrameworkCore /// public class OpenIddictTokenStoreResolver : IOpenIddictTokenStoreResolver { - private static readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + private readonly TypeResolutionCache _cache; private readonly IOptionsMonitor _options; private readonly IServiceProvider _provider; public OpenIddictTokenStoreResolver( + [NotNull] TypeResolutionCache cache, [NotNull] IOptionsMonitor options, [NotNull] IServiceProvider provider) { + _cache = cache; _options = options; _provider = provider; } @@ -80,5 +82,11 @@ namespace OpenIddict.EntityFrameworkCore return (IOpenIddictTokenStore) _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 { } } } diff --git a/test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs b/test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs index a28b1777..36cb33be 100644 --- a/test/OpenIddict.EntityFramework.Tests/OpenIddictEntityFrameworkExtensionsTests.cs +++ b/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<,,,,>))] diff --git a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs b/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs index f21ad750..f623d3c1 100644 --- a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs b/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs index 2ac870fd..329dd09e 100644 --- a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs b/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs index 1e66222a..8d3db847 100644 --- a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs b/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs index cfe13b5d..6903d605 100644 --- a/test/OpenIddict.EntityFramework.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFramework.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs b/test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs index a23197ec..3c519a9e 100644 --- a/test/OpenIddict.EntityFrameworkCore.Tests/OpenIddictEntityFrameworkCoreExtensionsTests.cs +++ b/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<,,,,>))] diff --git a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs b/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs index 9e6bfe4c..2fefb1b1 100644 --- a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictApplicationStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs b/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs index ef04c8d7..e58821fc 100644 --- a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictAuthorizationStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs b/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs index b46003e9..89fea545 100644 --- a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictScopeStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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()); diff --git a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs b/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs index 973eca85..db5a2db1 100644 --- a/test/OpenIddict.EntityFrameworkCore.Tests/Resolvers/OpenIddictTokenStoreResolverTests.cs +++ b/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>(); 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()); @@ -42,7 +43,7 @@ namespace OpenIddict.EntityFrameworkCore.Tests var options = Mock.Of>(); 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(() => resolver.Get()); @@ -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(() => resolver.Get()); @@ -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());