Skip to content

Commit 6085858

Browse files
(GH-599) Allowed microsoft ioc extension to configure registered logger provider
1 parent 09c5df2 commit 6085858

File tree

3 files changed

+72
-46
lines changed

3 files changed

+72
-46
lines changed

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

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
namespace DotNetToolkit.Repository.Extensions.Microsoft.DependencyInjection
22
{
33
using Configuration.Interceptors;
4+
using Configuration.Logging;
45
using Configuration.Options;
56
using Configuration.Options.Internal;
67
using global::Microsoft.Extensions.DependencyInjection;
78
using JetBrains.Annotations;
89
using Services;
910
using System;
1011
using System.Collections.Generic;
12+
using System.Linq;
1113
using System.Reflection;
1214
using Transactions;
1315
using Utility;
@@ -71,33 +73,25 @@ public static IServiceCollection AddRepositories([NotNull] this IServiceCollecti
7173

7274
optionsAction(optionsBuilder);
7375

74-
var registeredInterceptorTypes = new List<Type>();
76+
var scanResults = AssemblyScanner.FindRepositoriesFromAssemblies(assembliesToScan);
7577

76-
// Scan assemblies for repositories, services, and interceptors
77-
AssemblyScanner
78-
.FindRepositoriesFromAssemblies(assembliesToScan)
79-
.ForEach(scanResult =>
78+
scanResults.ForEach(scanResult =>
79+
{
80+
foreach (var implementationType in scanResult.ImplementationTypes)
8081
{
81-
foreach (var implementationType in scanResult.ImplementationTypes)
82-
{
83-
// Register as interface
84-
services.Add(new ServiceDescriptor(
85-
scanResult.InterfaceType,
86-
implementationType,
87-
serviceLifetime));
88-
89-
// Register as self
90-
services.Add(new ServiceDescriptor(
91-
implementationType,
92-
implementationType,
93-
serviceLifetime));
94-
95-
if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
96-
{
97-
registeredInterceptorTypes.Add(implementationType);
98-
}
99-
}
100-
});
82+
// Register as interface
83+
services.Add(new ServiceDescriptor(
84+
scanResult.InterfaceType,
85+
implementationType,
86+
serviceLifetime));
87+
88+
// Register as self
89+
services.Add(new ServiceDescriptor(
90+
implementationType,
91+
implementationType,
92+
serviceLifetime));
93+
}
94+
});
10195

10296
// Register other services
10397
services.Add(new ServiceDescriptor(
@@ -126,14 +120,21 @@ public static IServiceCollection AddRepositories([NotNull] this IServiceCollecti
126120
{
127121
var options = new RepositoryOptions(optionsBuilder.Options);
128122

129-
foreach (var interceptorType in registeredInterceptorTypes)
123+
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
130124
{
131125
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
132126
{
133127
options = options.With(interceptorType, () => (IRepositoryInterceptor)sp.GetService(interceptorType));
134128
}
135129
}
136130

131+
if (optionsBuilder.Options.LoggerProvider == null)
132+
{
133+
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
134+
135+
options = options.With((ILoggerProvider)sp.GetService(loggerProviderType));
136+
}
137+
137138
return options;
138139
},
139140
serviceLifetime));
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace DotNetToolkit.Repository.Integration.Test.Data
2+
{
3+
using Configuration.Logging;
4+
5+
public class TestLoggerProvider : ILoggerProvider
6+
{
7+
public ILogger Create(string categoryName) => new TestLogger();
8+
}
9+
10+
public class TestLogger : ILogger
11+
{
12+
public bool IsEnabled(LogLevel logLevel) => false;
13+
public void Log(LogLevel logLevel, string message) { }
14+
}
15+
}

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

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
using Microsoft.Extensions.DependencyInjection;
99
using Services;
1010
using System;
11-
using System.Collections.Generic;
1211
using System.Linq;
13-
using System.Reflection;
1412
using Transactions;
1513
using Xunit;
1614
using Xunit.Abstractions;
@@ -27,12 +25,12 @@ public void DependencyInjectionCanConfigureRepositoriesServices()
2725
services.AddRepositories<MicrosoftDependencyInjectionTests>(options =>
2826
{
2927
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
30-
options.UseLoggerProvider(TestXUnitLoggerProvider);
3128
});
3229

3330
var provider = services.BuildServiceProvider();
3431

3532
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
33+
Assert.NotNull(provider.GetService<TestLoggerProvider>());
3634
Assert.NotNull(provider.GetService<TestRepositoryTimeStampInterceptor>());
3735
Assert.NotNull(provider.GetService<TestRepositoryInterceptor>());
3836
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
@@ -68,10 +66,10 @@ public void DependencyInjectionCanConfigureServices()
6866
var services = new ServiceCollection();
6967

7068
services.AddRepositories<MicrosoftDependencyInjectionTests>(options =>
71-
{
72-
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
73-
options.UseLoggerProvider(TestXUnitLoggerProvider);
74-
});
69+
{
70+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
71+
options.UseLoggerProvider(TestXUnitLoggerProvider);
72+
});
7573

7674
var provider = services.BuildServiceProvider();
7775

@@ -118,11 +116,9 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
118116

119117
var provider = services.BuildServiceProvider();
120118

121-
var repo = new Repository<Customer>(provider.GetService<IRepositoryOptions>());
122-
123-
var configuredInterceptors = GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo);
119+
var repoOptions = provider.GetService<IRepositoryOptions>();
124120

125-
Assert.Equal(3, configuredInterceptors.Count());
121+
Assert.Equal(3, repoOptions.Interceptors.Count());
126122
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
127123
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
128124

@@ -137,12 +133,12 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
137133
Assert.Null(registeredInterceptor2.P1);
138134
Assert.False(registeredInterceptor2.P2);
139135

140-
var configueredInterceptor1 = (TestRepositoryTimeStampInterceptor)configuredInterceptors[typeof(TestRepositoryTimeStampInterceptor)].Value;
136+
var configueredInterceptor1 = (TestRepositoryTimeStampInterceptor)repoOptions.Interceptors[typeof(TestRepositoryTimeStampInterceptor)].Value;
141137

142138
Assert.NotNull(configueredInterceptor1);
143139
Assert.Equal("RANDOM USER", configueredInterceptor1.User);
144140

145-
var configueredInterceptor2 = (TestRepositoryInterceptor)configuredInterceptors[typeof(TestRepositoryInterceptor)].Value;
141+
var configueredInterceptor2 = (TestRepositoryInterceptor)repoOptions.Interceptors[typeof(TestRepositoryInterceptor)].Value;
146142

147143
Assert.NotNull(configueredInterceptor2);
148144
Assert.Equal("RANDOM P1", configueredInterceptor2.P1);
@@ -162,22 +158,36 @@ public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
162158

163159
var provider = services.BuildServiceProvider();
164160

165-
var repo = new Repository<Customer>(provider.GetService<IRepositoryOptions>());
161+
var repoOptions = provider.GetService<IRepositoryOptions>();
166162

167-
Assert.Equal(3, GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo).Count());
163+
Assert.Equal(3, repoOptions.Interceptors.Count());
168164
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
169165
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
170166
Assert.NotNull(provider.GetService<TestRepositoryTimeStampInterceptor>());
171167
Assert.NotNull(provider.GetService<TestRepositoryInterceptor>());
172168
}
173169

174-
private static IReadOnlyDictionary<Type, Lazy<IRepositoryInterceptor>> GetLazyInterceptorsOptionsFromPrivateField<T>(object obj)
170+
[Fact]
171+
public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
175172
{
176-
var options = (IRepositoryOptions)typeof(T)
177-
.GetField("_options", BindingFlags.NonPublic | BindingFlags.Instance)
178-
.GetValue(obj);
173+
var services = new ServiceCollection();
174+
175+
services.AddRepositories<MicrosoftDependencyInjectionTests>(options =>
176+
{
177+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
178+
options.UseLoggerProvider(TestXUnitLoggerProvider);
179+
});
180+
181+
var provider = services.BuildServiceProvider();
182+
var repoOptions = provider.GetService<IRepositoryOptions>();
183+
184+
Assert.Equal(typeof(TestXUnitLoggerProvider), repoOptions.LoggerProvider.GetType());
179185

180-
return options.Interceptors;
186+
Assert.Equal(3, repoOptions.Interceptors.Count());
187+
Assert.Equal(3, provider.GetServices<IRepositoryInterceptor>().Count());
188+
Assert.NotNull(provider.GetService<TestRepositoryInterceptorWithDependencyInjectedServices>());
189+
Assert.NotNull(provider.GetService<TestRepositoryTimeStampInterceptor>());
190+
Assert.NotNull(provider.GetService<TestRepositoryInterceptor>());
181191
}
182192
}
183193
}

0 commit comments

Comments
 (0)