Skip to content

Commit 9175003

Browse files
Merge pull request #600 from johelvisguzman/GH-599
GH-599 Allow IOC extension projects to scan for logging providers
2 parents 9480a4a + 4f5d15c commit 9175003

File tree

8 files changed

+181
-114
lines changed

8 files changed

+181
-114
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));

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

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

src/DotNetToolkit.Repository/Utility/AssemblyScanner.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace DotNetToolkit.Repository.Utility
22
{
33
using Configuration.Interceptors;
4+
using Configuration.Logging;
45
using Extensions.Internal;
56
using JetBrains.Annotations;
67
using Services;
@@ -49,6 +50,7 @@ private AssemblyScanner([NotNull] IEnumerable<Type> types)
4950
typeof(IReadOnlyRepository<,,>),
5051
typeof(IReadOnlyRepository<,,,>),
5152
typeof(IRepositoryInterceptor),
53+
typeof(ILoggerProvider),
5254
};
5355
}
5456

@@ -91,6 +93,18 @@ public void ForEach([NotNull] Action<AssemblyScanResult> action)
9193
}
9294
}
9395

96+
/// <summary>
97+
/// Gets a collection of types that implement the specified interface type.
98+
/// </summary>
99+
/// <typeparam name="T">The interface type to get the implementations from.</typeparam>
100+
/// <returns>A collection of types that implement the specified interface type.</returns>
101+
public IEnumerable<Type> OfType<T>()
102+
{
103+
return this
104+
.Where(result => result.InterfaceType == typeof(T))
105+
.SelectMany(result => result.ImplementationTypes);
106+
}
107+
94108
#endregion
95109

96110
#region Private Methods
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+
}

0 commit comments

Comments
 (0)