Skip to content

Commit e1f1d7d

Browse files
(GH-599) Allowed unity ioc extension to configure registered logger provider
1 parent 6085858 commit e1f1d7d

File tree

2 files changed

+48
-35
lines changed

2 files changed

+48
-35
lines changed

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
namespace DotNetToolkit.Repository.Extensions.Unity
22
{
33
using Configuration.Interceptors;
4+
using Configuration.Logging;
45
using Configuration.Options;
56
using Configuration.Options.Internal;
67
using global::Unity;
78
using global::Unity.Lifetime;
89
using JetBrains.Annotations;
910
using Services;
1011
using System;
11-
using System.Collections.Generic;
12+
using System.Linq;
1213
using System.Reflection;
1314
using Transactions;
1415
using Utility;
@@ -72,27 +73,23 @@ public static void RegisterRepositories([NotNull] this IUnityContainer container
7273

7374
optionsAction(optionsBuilder);
7475

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

77-
// Scan assemblies for repositories, services, and interceptors
78-
AssemblyScanner
79-
.FindRepositoriesFromAssemblies(assembliesToScan)
80-
.ForEach(scanResult =>
78+
scanResults.ForEach(scanResult =>
79+
{
80+
foreach (var implementationType in scanResult.ImplementationTypes)
8181
{
82-
foreach (var implementationType in scanResult.ImplementationTypes)
82+
if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
83+
{
84+
container.RegisterType(implementationType, implementationType);
85+
container.RegisterType(scanResult.InterfaceType, implementationType, implementationType.FullName);
86+
}
87+
else
8388
{
84-
if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
85-
{
86-
container.RegisterType(implementationType, implementationType);
87-
container.RegisterType(scanResult.InterfaceType, implementationType, implementationType.FullName);
88-
registeredInterceptorTypes.Add(implementationType);
89-
}
90-
else
91-
{
92-
container.RegisterType(scanResult.InterfaceType, implementationType);
93-
}
89+
container.RegisterType(scanResult.InterfaceType, implementationType);
9490
}
95-
});
91+
}
92+
});
9693

9794
// Register other services
9895
container.RegisterFactory<IRepositoryFactory>(c => new RepositoryFactory(c.Resolve<IRepositoryOptions>()), factorylifetimeManager);
@@ -103,14 +100,21 @@ public static void RegisterRepositories([NotNull] this IUnityContainer container
103100
{
104101
var options = new RepositoryOptions(optionsBuilder.Options);
105102

106-
foreach (var interceptorType in registeredInterceptorTypes)
103+
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
107104
{
108105
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
109106
{
110107
options = options.With(interceptorType, () => (IRepositoryInterceptor)c.Resolve(interceptorType));
111108
}
112109
}
113110

111+
if (optionsBuilder.Options.LoggerProvider == null)
112+
{
113+
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
114+
115+
options = options.With((ILoggerProvider)c.Resolve(loggerProviderType));
116+
}
117+
114118
return options;
115119
}, factorylifetimeManager);
116120

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

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
using InMemory;
99
using Services;
1010
using System;
11-
using System.Collections.Generic;
1211
using System.Linq;
13-
using System.Reflection;
1412
using Transactions;
1513
using Unity;
1614
using Xunit;
@@ -28,10 +26,10 @@ public void DependencyInjectionCanConfigureRepositoriesServices()
2826
container.RegisterRepositories<MicrosoftDependencyInjectionTests>(options =>
2927
{
3028
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
31-
options.UseLoggerProvider(TestXUnitLoggerProvider);
3229
});
3330

3431
Assert.NotNull(container.Resolve<TestRepositoryInterceptorWithDependencyInjectedServices>());
32+
Assert.NotNull(container.Resolve<TestLoggerProvider>());
3533
Assert.NotNull(container.Resolve<TestRepositoryTimeStampInterceptor>());
3634
Assert.NotNull(container.Resolve<TestRepositoryInterceptor>());
3735
Assert.Equal(3, container.ResolveAll<IRepositoryInterceptor>().Count());
@@ -111,11 +109,9 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
111109
options.UseLoggerProvider(TestXUnitLoggerProvider);
112110
});
113111

114-
var repo = new Repository<Customer>(container.Resolve<RepositoryOptions>());
115-
116-
var configuredInterceptors = GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo);
112+
var repoOptions = container.Resolve<IRepositoryOptions>();
117113

118-
Assert.Equal(3, configuredInterceptors.Count());
114+
Assert.Equal(3, repoOptions.Interceptors.Count());
119115
Assert.Equal(3, container.ResolveAll<IRepositoryInterceptor>().Count());
120116
Assert.NotNull(container.Resolve<TestRepositoryInterceptorWithDependencyInjectedServices>());
121117

@@ -130,12 +126,12 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
130126
Assert.Null(registeredInterceptor2.P1);
131127
Assert.False(registeredInterceptor2.P2);
132128

133-
var configueredInterceptor1 = (TestRepositoryTimeStampInterceptor)configuredInterceptors[typeof(TestRepositoryTimeStampInterceptor)].Value;
129+
var configueredInterceptor1 = (TestRepositoryTimeStampInterceptor)repoOptions.Interceptors[typeof(TestRepositoryTimeStampInterceptor)].Value;
134130

135131
Assert.NotNull(configueredInterceptor1);
136132
Assert.Equal("RANDOM USER", configueredInterceptor1.User);
137133

138-
var configueredInterceptor2 = (TestRepositoryInterceptor)configuredInterceptors[typeof(TestRepositoryInterceptor)].Value;
134+
var configueredInterceptor2 = (TestRepositoryInterceptor)repoOptions.Interceptors[typeof(TestRepositoryInterceptor)].Value;
139135

140136
Assert.NotNull(configueredInterceptor2);
141137
Assert.Equal("RANDOM P1", configueredInterceptor2.P1);
@@ -153,22 +149,35 @@ public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
153149
options.UseLoggerProvider(TestXUnitLoggerProvider);
154150
});
155151

156-
var repo = new Repository<Customer>(container.Resolve<RepositoryOptions>());
152+
var repoOptions = container.Resolve<IRepositoryOptions>();
157153

158-
Assert.Equal(3, GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo).Count());
154+
Assert.Equal(3, repoOptions.Interceptors.Count());
159155
Assert.Equal(3, container.ResolveAll<IRepositoryInterceptor>().Count());
160156
Assert.NotNull(container.Resolve<TestRepositoryInterceptorWithDependencyInjectedServices>());
161157
Assert.NotNull(container.Resolve<TestRepositoryTimeStampInterceptor>());
162158
Assert.NotNull(container.Resolve<TestRepositoryInterceptor>());
163159
}
164160

165-
private static IReadOnlyDictionary<Type, Lazy<IRepositoryInterceptor>> GetLazyInterceptorsOptionsFromPrivateField<T>(object obj)
161+
[Fact]
162+
public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
166163
{
167-
var options = (IRepositoryOptions)typeof(T)
168-
.GetField("_options", BindingFlags.NonPublic | BindingFlags.Instance)
169-
.GetValue(obj);
164+
var container = new UnityContainer();
165+
166+
container.RegisterRepositories<MicrosoftDependencyInjectionTests>(options =>
167+
{
168+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
169+
options.UseLoggerProvider(TestXUnitLoggerProvider);
170+
});
171+
172+
var repoOptions = container.Resolve<IRepositoryOptions>();
173+
174+
Assert.Equal(typeof(TestXUnitLoggerProvider), repoOptions.LoggerProvider.GetType());
170175

171-
return options.Interceptors;
176+
Assert.Equal(3, repoOptions.Interceptors.Count());
177+
Assert.Equal(3, container.ResolveAll<IRepositoryInterceptor>().Count());
178+
Assert.NotNull(container.Resolve<TestRepositoryInterceptorWithDependencyInjectedServices>());
179+
Assert.NotNull(container.Resolve<TestRepositoryTimeStampInterceptor>());
180+
Assert.NotNull(container.Resolve<TestRepositoryInterceptor>());
172181
}
173182
}
174183
}

0 commit comments

Comments
 (0)