Skip to content

Commit 4f5d15c

Browse files
(GH-599) Allowed ninject ioc extension to configure registered logger provider
1 parent e1f1d7d commit 4f5d15c

File tree

2 files changed

+47
-33
lines changed

2 files changed

+47
-33
lines changed

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
namespace DotNetToolkit.Repository.Extensions.Ninject
22
{
33
using Configuration.Interceptors;
4+
using Configuration.Logging;
45
using Configuration.Options;
56
using Configuration.Options.Internal;
67
using global::Ninject;
78
using JetBrains.Annotations;
89
using Services;
910
using System;
10-
using System.Collections.Generic;
11+
using System.Linq;
1112
using System.Reflection;
1213
using Transactions;
1314
using Utility;
@@ -65,27 +66,23 @@ public static void BindRepositories([NotNull] this IKernel kernel, [NotNull] Act
6566

6667
optionsAction(optionsBuilder);
6768

68-
var registeredInterceptorTypes = new List<Type>();
69+
var scanResults = AssemblyScanner.FindRepositoriesFromAssemblies(assembliesToScan);
6970

70-
// Scan assemblies for repositories, services, and interceptors
71-
AssemblyScanner
72-
.FindRepositoriesFromAssemblies(assembliesToScan)
73-
.ForEach(scanResult =>
71+
scanResults.ForEach(scanResult =>
72+
{
73+
foreach (var implementationType in scanResult.ImplementationTypes)
7474
{
75-
foreach (var implementationType in scanResult.ImplementationTypes)
75+
if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
76+
{
77+
kernel.Bind(implementationType).ToSelf();
78+
kernel.Bind(scanResult.InterfaceType).To(implementationType);
79+
}
80+
else
7681
{
77-
if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
78-
{
79-
kernel.Bind(implementationType).ToSelf();
80-
kernel.Bind(scanResult.InterfaceType).To(implementationType);
81-
registeredInterceptorTypes.Add(implementationType);
82-
}
83-
else
84-
{
85-
kernel.Bind(scanResult.InterfaceType).To(implementationType);
86-
}
82+
kernel.Bind(scanResult.InterfaceType).To(implementationType);
8783
}
88-
});
84+
}
85+
});
8986

9087
// Binds other services
9188
kernel.Bind<IRepositoryFactory>().ToMethod(c => new RepositoryFactory(c.Kernel.Get<IRepositoryOptions>()));
@@ -96,14 +93,21 @@ public static void BindRepositories([NotNull] this IKernel kernel, [NotNull] Act
9693
{
9794
var options = new RepositoryOptions(optionsBuilder.Options);
9895

99-
foreach (var interceptorType in registeredInterceptorTypes)
96+
foreach (var interceptorType in scanResults.OfType<IRepositoryInterceptor>())
10097
{
10198
if (!optionsBuilder.Options.Interceptors.ContainsKey(interceptorType))
10299
{
103100
options = options.With(interceptorType, () => (IRepositoryInterceptor)c.Kernel.Get(interceptorType));
104101
}
105102
}
106103

104+
if (optionsBuilder.Options.LoggerProvider == null)
105+
{
106+
var loggerProviderType = scanResults.OfType<ILoggerProvider>().FirstOrDefault();
107+
108+
options = options.With((ILoggerProvider)c.Kernel.Get(loggerProviderType));
109+
}
110+
107111
return options;
108112
});
109113

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

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Ninject;
99
using Services;
1010
using System;
11-
using System.Collections.Generic;
1211
using System.Linq;
1312
using System.Reflection;
1413
using Transactions;
@@ -111,11 +110,9 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
111110
options.UseLoggerProvider(TestXUnitLoggerProvider);
112111
});
113112

114-
var repo = new Repository<Customer>(kernel.Get<IRepositoryOptions>());
115-
116-
var configuredInterceptors = GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo);
113+
var repoOptions = kernel.Get<IRepositoryOptions>();
117114

118-
Assert.Equal(3, configuredInterceptors.Count());
115+
Assert.Equal(3, repoOptions.Interceptors.Count());
119116
Assert.Equal(3, kernel.GetAll<IRepositoryInterceptor>().Count());
120117
Assert.NotNull(kernel.Get<TestRepositoryInterceptorWithDependencyInjectedServices>());
121118

@@ -130,12 +127,12 @@ public void DependencyInjectionCanConfigureRepositoriesWithInterceptorsFromOptio
130127
Assert.Null(registeredInterceptor2.P1);
131128
Assert.False(registeredInterceptor2.P2);
132129

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

135132
Assert.NotNull(configueredInterceptor1);
136133
Assert.Equal("RANDOM USER", configueredInterceptor1.User);
137134

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

140137
Assert.NotNull(configueredInterceptor2);
141138
Assert.Equal("RANDOM P1", configueredInterceptor2.P1);
@@ -153,22 +150,35 @@ public void DependencyInjectionCanConfigureRepositoriesWithScannedInterceptors()
153150
options.UseLoggerProvider(TestXUnitLoggerProvider);
154151
});
155152

156-
var repo = new Repository<Customer>(kernel.Get<IRepositoryOptions>());
153+
var repoOptions = kernel.Get<IRepositoryOptions>();
157154

158-
Assert.Equal(3, GetLazyInterceptorsOptionsFromPrivateField<InternalRepositoryBase<Customer>>(repo).Count());
155+
Assert.Equal(3, repoOptions.Interceptors.Count());
159156
Assert.Equal(3, kernel.GetAll<IRepositoryInterceptor>().Count());
160157
Assert.NotNull(kernel.Get<TestRepositoryInterceptorWithDependencyInjectedServices>());
161158
Assert.NotNull(kernel.Get<TestRepositoryTimeStampInterceptor>());
162159
Assert.NotNull(kernel.Get<TestRepositoryInterceptor>());
163160
}
164161

165-
private static IReadOnlyDictionary<Type, Lazy<IRepositoryInterceptor>> GetLazyInterceptorsOptionsFromPrivateField<T>(object obj)
162+
[Fact]
163+
public void DependencyInjectionCanConfigureLogginProviderWithScannedLogger()
166164
{
167-
var options = (IRepositoryOptions)typeof(T)
168-
.GetField("_options", BindingFlags.NonPublic | BindingFlags.Instance)
169-
.GetValue(obj);
165+
var kernel = new StandardKernel();
170166

171-
return options.Interceptors;
167+
kernel.BindRepositories<MicrosoftDependencyInjectionTests>(options =>
168+
{
169+
options.UseInMemoryDatabase(Guid.NewGuid().ToString(), ignoreTransactionWarning: true);
170+
options.UseLoggerProvider(TestXUnitLoggerProvider);
171+
});
172+
173+
var repoOptions = kernel.Get<IRepositoryOptions>();
174+
175+
Assert.Equal(typeof(TestXUnitLoggerProvider), repoOptions.LoggerProvider.GetType());
176+
177+
Assert.Equal(3, repoOptions.Interceptors.Count());
178+
Assert.Equal(3, kernel.GetAll<IRepositoryInterceptor>().Count());
179+
Assert.NotNull(kernel.Get<TestRepositoryInterceptorWithDependencyInjectedServices>());
180+
Assert.NotNull(kernel.Get<TestRepositoryTimeStampInterceptor>());
181+
Assert.NotNull(kernel.Get<TestRepositoryInterceptor>());
172182
}
173183
}
174184
}

0 commit comments

Comments
 (0)