Skip to content

Commit 15caf81

Browse files
Merge pull request #689 from johelvisguzman/GH-677
GH-677 Add caching provider type to scan in the AssemblyScanner
2 parents 68dae67 + 31fe39e commit 15caf81

File tree

8 files changed

+162
-54
lines changed

8 files changed

+162
-54
lines changed

src/DotNetToolkit.Repository.Extensions.Microsoft.DependencyInjection/ServiceCollectionExtensions.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DotNetToolkit.Repository.Extensions.Microsoft.DependencyInjection
22
{
3+
using Configuration.Caching;
34
using Configuration.Interceptors;
45
using Configuration.Logging;
56
using global::Microsoft.Extensions.DependencyInjection;
@@ -99,13 +100,13 @@ public static IServiceCollection AddRepositories([NotNull] this IServiceCollecti
99100

100101
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
101102
{
102-
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
103+
if (!options.Interceptors.ContainsKey(interceptorType))
103104
{
104105
options = options.With(interceptorType, () => (IRepositoryInterceptor)sp.GetService(interceptorType));
105106
}
106107
}
107108

108-
if (optionsBuilder.Options.LoggerProvider == null)
109+
if (options.LoggerProvider == null)
109110
{
110111
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
111112

@@ -115,6 +116,16 @@ public static IServiceCollection AddRepositories([NotNull] this IServiceCollecti
115116
}
116117
}
117118

119+
if (options.CachingProvider == null)
120+
{
121+
var cacheProviderType = scanResults.OfType<ICacheProvider>().FirstOrDefault();
122+
123+
if (cacheProviderType != null)
124+
{
125+
options = options.With((ICacheProvider)sp.GetService(cacheProviderType));
126+
}
127+
}
128+
118129
return options;
119130
},
120131
serviceLifetime));

src/DotNetToolkit.Repository.Extensions.Ninject/KernelExtensions.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DotNetToolkit.Repository.Extensions.Ninject
22
{
3+
using Configuration.Caching;
34
using Configuration.Interceptors;
45
using Configuration.Logging;
56
using global::Ninject;
@@ -82,13 +83,13 @@ public static void BindRepositories([NotNull] this IKernel kernel, [NotNull] Act
8283

8384
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
8485
{
85-
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
86+
if (!options.Interceptors.ContainsKey(interceptorType))
8687
{
8788
options = options.With(interceptorType, () => (IRepositoryInterceptor)c.Kernel.Get(interceptorType));
8889
}
8990
}
9091

91-
if (optionsBuilder.Options.LoggerProvider == null)
92+
if (options.LoggerProvider == null)
9293
{
9394
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
9495

@@ -98,6 +99,16 @@ public static void BindRepositories([NotNull] this IKernel kernel, [NotNull] Act
9899
}
99100
}
100101

102+
if (options.CachingProvider == null)
103+
{
104+
var cacheProviderType = scanResults.OfType<ICacheProvider>().FirstOrDefault();
105+
106+
if (cacheProviderType != null)
107+
{
108+
options = options.With((ICacheProvider)c.Kernel.Get(cacheProviderType));
109+
}
110+
}
111+
101112
return options;
102113
});
103114

src/DotNetToolkit.Repository.Extensions.Unity/UnityContainerExtensions.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DotNetToolkit.Repository.Extensions.Unity
22
{
3+
using Configuration.Caching;
34
using Configuration.Interceptors;
45
using Configuration.Logging;
56
using DotNetToolkit.Repository.Internal;
@@ -97,13 +98,13 @@ public static void RegisterRepositories([NotNull] this IUnityContainer container
9798

9899
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
99100
{
100-
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
101+
if (!options.Interceptors.ContainsKey(interceptorType))
101102
{
102103
options = options.With(interceptorType, () => (IRepositoryInterceptor)c.Resolve(interceptorType));
103104
}
104105
}
105106

106-
if (optionsBuilder.Options.LoggerProvider == null)
107+
if (options.LoggerProvider == null)
107108
{
108109
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
109110

@@ -113,6 +114,16 @@ public static void RegisterRepositories([NotNull] this IUnityContainer container
113114
}
114115
}
115116

117+
if (options.CachingProvider == null)
118+
{
119+
var cacheProviderType = scanResults.OfType<ICacheProvider>().FirstOrDefault();
120+
121+
if (cacheProviderType != null)
122+
{
123+
options = options.With((ICacheProvider)c.Resolve(cacheProviderType));
124+
}
125+
}
126+
116127
return options;
117128
}, factorylifetimeManager);
118129

src/DotNetToolkit.Repository/Utility/AssemblyScanner.cs

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DotNetToolkit.Repository.Utility
22
{
3+
using Configuration.Caching;
34
using Configuration.Interceptors;
45
using Configuration.Logging;
56
using Extensions.Internal;
@@ -20,7 +21,33 @@ public class AssemblyScanner : IEnumerable<AssemblyScanner.AssemblyScanResult>
2021
#region Fields
2122

2223
private readonly IEnumerable<Type> _types;
23-
private readonly Type[] _interfaceTypesToScan;
24+
25+
private readonly Type[] DefaultInterfaceTypesToScan = new[]
26+
{
27+
typeof(IService<>),
28+
typeof(IService<,>),
29+
typeof(IService<,,>),
30+
typeof(IService<,,,>),
31+
typeof(IRepository<>),
32+
typeof(IRepository<,>),
33+
typeof(IRepository<,,>),
34+
typeof(IRepository<,,,>),
35+
typeof(IReadOnlyService<>),
36+
typeof(IReadOnlyService<,>),
37+
typeof(IReadOnlyService<,,>),
38+
typeof(IReadOnlyService<,,,>),
39+
typeof(IReadOnlyRepository<>),
40+
typeof(IReadOnlyRepository<,>),
41+
typeof(IReadOnlyRepository<,,>),
42+
typeof(IReadOnlyRepository<,,,>),
43+
typeof(IRepositoryInterceptor),
44+
typeof(ILoggerProvider),
45+
typeof(ICacheProvider),
46+
typeof(IRepositoryFactory),
47+
typeof(IServiceFactory),
48+
typeof(IUnitOfWork),
49+
typeof(IUnitOfWorkFactory),
50+
};
2451

2552
#endregion
2653

@@ -32,31 +59,6 @@ public class AssemblyScanner : IEnumerable<AssemblyScanner.AssemblyScanResult>
3259
private AssemblyScanner([NotNull] IEnumerable<Type> types)
3360
{
3461
_types = Guard.NotNull(types, nameof(types));
35-
_interfaceTypesToScan = new[]
36-
{
37-
typeof(IService<>),
38-
typeof(IService<,>),
39-
typeof(IService<,,>),
40-
typeof(IService<,,,>),
41-
typeof(IRepository<>),
42-
typeof(IRepository<,>),
43-
typeof(IRepository<,,>),
44-
typeof(IRepository<,,,>),
45-
typeof(IReadOnlyService<>),
46-
typeof(IReadOnlyService<,>),
47-
typeof(IReadOnlyService<,,>),
48-
typeof(IReadOnlyService<,,,>),
49-
typeof(IReadOnlyRepository<>),
50-
typeof(IReadOnlyRepository<,>),
51-
typeof(IReadOnlyRepository<,,>),
52-
typeof(IReadOnlyRepository<,,,>),
53-
typeof(IRepositoryInterceptor),
54-
typeof(ILoggerProvider),
55-
typeof(IRepositoryFactory),
56-
typeof(IServiceFactory),
57-
typeof(IUnitOfWork),
58-
typeof(IUnitOfWorkFactory),
59-
};
6062
}
6163

6264
#endregion
@@ -116,7 +118,7 @@ public IEnumerable<Type> OfType<T>()
116118

117119
private IEnumerable<AssemblyScanResult> ScanResults()
118120
{
119-
var interfaceTypes = _interfaceTypesToScan
121+
var interfaceTypes = DefaultInterfaceTypesToScan
120122
.SelectMany(interfaceType => _types.Where(x => !x.GetTypeInfo().IsClass && x.ImplementsInterface(interfaceType)))
121123
.Distinct();
122124

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
namespace DotNetToolkit.Repository.Integration.Test.Data
2+
{
3+
using Configuration.Caching;
4+
using System;
5+
using System.Collections.Concurrent;
6+
7+
public class TestCachingProvider : ICacheProvider
8+
{
9+
private static readonly ConcurrentDictionary<string, object> _cache = new ConcurrentDictionary<string, object>();
10+
11+
public int Increment(string key, int defaultValue, int incrementValue)
12+
{
13+
return (int)_cache.AddOrUpdate(key, defaultValue, (k, oldValue) => (int)oldValue + 1);
14+
}
15+
16+
public void Remove(string key)
17+
{
18+
_cache.TryRemove(key, out _);
19+
}
20+
21+
public void Set<T>(string key, T value, TimeSpan? expiry = null, Action<string> cacheRemovedCallback = null)
22+
{
23+
_cache.AddOrUpdate(key, value, (k, oldValue) => value);
24+
}
25+
26+
public bool TryGetValue<T>(string key, out T value)
27+
{
28+
if (_cache.TryGetValue(key, out object obj))
29+
{
30+
value = (T)obj;
31+
return true;
32+
}
33+
34+
value = default(T);
35+
return false;
36+
}
37+
}
38+
}

test/DotNetToolkit.Repository.Integration.Test/Tests/DependencyInjection/DependencyInjectionTests.Microsoft.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public void DependencyInjectionCanConfigureRepositoriesServices()
3030

3131
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
3232
Assert.NotNull(provider.GetService<TestLoggerProvider>());
33+
Assert.NotNull(provider.GetService<TestCachingProvider>());
3334
Assert.NotNull(provider.GetService<TestRepositoryTimeStampInterceptor>());
3435
Assert.NotNull(provider.GetService<TestRepositoryInterceptor>());
3536
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
@@ -145,7 +146,7 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
145146
}
146147

147148
[Fact]
148-
public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
149+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedInterceptors()
149150
{
150151
var services = new ServiceCollection();
151152

@@ -167,7 +168,7 @@ public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
167168
}
168169

169170
[Fact]
170-
public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
171+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedScannedLoggerProvider()
171172
{
172173
var services = new ServiceCollection();
173174

@@ -181,12 +182,23 @@ public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
181182
var repoOptions = provider.GetService<IRepositoryOptions>();
182183

183184
Assert.Equal(typeof(TestXUnitLoggerProvider), repoOptions.LoggerProvider.GetType());
185+
}
184186

185-
Assert.Equal(3, repoOptions.Interceptors.Count());
186-
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
187-
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
188-
Assert.NotNull(provider.GetService<TestRepositoryTimeStampInterceptor>());
189-
Assert.NotNull(provider.GetService<TestRepositoryInterceptor>());
187+
[Fact]
188+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedScannedCachingProvider()
189+
{
190+
var services = new ServiceCollection();
191+
192+
services.AddRepositories<MicrosoftDependencyInjectionTests>(options =>
193+
{
194+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
195+
options.UseCachingProvider(new TestCachingProvider());
196+
});
197+
198+
var provider = services.BuildServiceProvider();
199+
var repoOptions = provider.GetService<IRepositoryOptions>();
200+
201+
Assert.Equal(typeof(TestCachingProvider), repoOptions.CachingProvider.GetType());
190202
}
191203
}
192204
}

test/DotNetToolkit.Repository.Integration.Test/Tests/DependencyInjection/DependencyInjectionTests.Ninject.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public void DependencyInjectionCanConfigureRepositoriesServices()
3030
});
3131

3232
Assert.NotNull(kernel.Get<TestRepositoryInterceptorWithDependencyInjectedServices>());
33+
Assert.NotNull(kernel.Get<TestLoggerProvider>());
34+
Assert.NotNull(kernel.Get<TestCachingProvider>());
3335
Assert.NotNull(kernel.Get<TestRepositoryTimeStampInterceptor>());
3436
Assert.NotNull(kernel.Get<TestRepositoryInterceptor>());
3537
Assert.Equal(3, kernel.GetAll<IRepositoryInterceptor>().Count());
@@ -139,7 +141,7 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
139141
}
140142

141143
[Fact]
142-
public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
144+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedInterceptors()
143145
{
144146
var kernel = new StandardKernel();
145147

@@ -159,7 +161,7 @@ public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
159161
}
160162

161163
[Fact]
162-
public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
164+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedScannedLoggerProvider()
163165
{
164166
var kernel = new StandardKernel();
165167

@@ -172,12 +174,22 @@ public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
172174
var repoOptions = kernel.Get<IRepositoryOptions>();
173175

174176
Assert.Equal(typeof(TestXUnitLoggerProvider), repoOptions.LoggerProvider.GetType());
177+
}
175178

176-
Assert.Equal(3, repoOptions.Interceptors.Count());
177-
Assert.Equal(3, kernel.GetAll<IRepositoryInterceptor>().Count());
178-
Assert.NotNull(kernel.Get<TestRepositoryInterceptorWithDependencyInjectedServices>());
179-
Assert.NotNull(kernel.Get<TestRepositoryTimeStampInterceptor>());
180-
Assert.NotNull(kernel.Get<TestRepositoryInterceptor>());
179+
[Fact]
180+
public void DependencyInjectionCanConfigureRepositoryOptionsWithScannedScannedCachingProvider()
181+
{
182+
var kernel = new StandardKernel();
183+
184+
kernel.BindRepositories<MicrosoftDependencyInjectionTests>(options =>
185+
{
186+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
187+
options.UseCachingProvider(new TestCachingProvider());
188+
});
189+
190+
var repoOptions = kernel.Get<IRepositoryOptions>();
191+
192+
Assert.Equal(typeof(TestCachingProvider), repoOptions.CachingProvider.GetType());
181193
}
182194
}
183195
}

0 commit comments

Comments
 (0)