diff --git a/WpfExtended.SourceGeneration.Tests/Class1.cs b/WpfExtended.SourceGeneration.Tests/Class1.cs index cc79248..a23b402 100644 --- a/WpfExtended.SourceGeneration.Tests/Class1.cs +++ b/WpfExtended.SourceGeneration.Tests/Class1.cs @@ -14,8 +14,6 @@ namespace WpfExtended.SourceGeneration.Tests [GenerateDependencyProperty] public Effect effect; - - public void TestValues() { this.SomeF.Should().Be(0); diff --git a/WpfExtended.Test/MainWindow.xaml.cs b/WpfExtended.Test/MainWindow.xaml.cs index 76b0bf4..7408a57 100644 --- a/WpfExtended.Test/MainWindow.xaml.cs +++ b/WpfExtended.Test/MainWindow.xaml.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Extensions; using System.IO; using System.Windows; @@ -25,9 +26,16 @@ namespace WpfExtended.Test set => this.SetTypedValue(ImageSourceProperty, value); } - public MainWindow() + private readonly ILogger scopedLogger; + private readonly ILogger logger; + + public MainWindow( + ILogger scopedLogger, + ILogger logger) { - InitializeComponent(); + this.InitializeComponent(); + this.scopedLogger = scopedLogger.ThrowIfNull(nameof(scopedLogger)); + this.logger = logger.ThrowIfNull(nameof(logger)); this.ImageSource = new BitmapImage(new Uri(Path.GetFullPath("Images/Test.jpg"))); this.BuildEffectsView(); } @@ -37,6 +45,8 @@ namespace WpfExtended.Test foreach(var effectType in TypeCrawler.GetTypes()) { var effect = Activator.CreateInstance(effectType).As(); + this.scopedLogger.LogInformation($"Creating effect {effectType.Name}"); + this.logger.LogInformation($"Creating effect {effectType.Name}"); var image = new CaptionedImage() { Width = 800, diff --git a/WpfExtended.Test/WpfExtended.Tests.csproj b/WpfExtended.Test/WpfExtended.Tests.csproj index 4b5cb9c..cacd5f9 100644 --- a/WpfExtended.Test/WpfExtended.Tests.csproj +++ b/WpfExtended.Test/WpfExtended.Tests.csproj @@ -7,7 +7,7 @@ - + diff --git a/WpfExtended/Extensions/ServiceManagerExtensions.cs b/WpfExtended/Extensions/ServiceManagerExtensions.cs new file mode 100644 index 0000000..69fc100 --- /dev/null +++ b/WpfExtended/Extensions/ServiceManagerExtensions.cs @@ -0,0 +1,17 @@ +using Slim; +using System.Extensions; +using System.Windows.Extensions.Http; + +namespace System.Windows.Extensions +{ + public static class ServiceManagerExtensions + { + public static IServiceProducer RegisterHttpFactory(this IServiceManager serviceManager) + { + serviceManager.ThrowIfNull(nameof(serviceManager)); + + serviceManager.RegisterResolver(new HttpClientResolver()); + return serviceManager; + } + } +} diff --git a/WpfExtended/Http/HttpClientResolver.cs b/WpfExtended/Http/HttpClientResolver.cs new file mode 100644 index 0000000..7d91f1e --- /dev/null +++ b/WpfExtended/Http/HttpClientResolver.cs @@ -0,0 +1,26 @@ +using Slim.Resolvers; +using System.Http; + +namespace System.Windows.Extensions.Http +{ + public sealed class HttpClientResolver : IDependencyResolver + { + private readonly Type clientType = typeof(HttpClient<>); + + public bool CanResolve(Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IHttpClient<>)) + { + return true; + } + + return false; + } + + public object Resolve(Slim.IServiceProvider serviceProvider, Type type) + { + var typedClientType = clientType.MakeGenericType(type.GetGenericArguments()); + return Activator.CreateInstance(typedClientType); + } + } +} diff --git a/WpfExtended/Launch/ExtendedApplication.cs b/WpfExtended/Launch/ExtendedApplication.cs index b5b799e..f2ab228 100644 --- a/WpfExtended/Launch/ExtendedApplication.cs +++ b/WpfExtended/Launch/ExtendedApplication.cs @@ -1,6 +1,9 @@ -using Slim; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Debug; +using Slim; using System.Extensions; using System.Threading.Tasks; +using System.Windows.Extensions.Logging; namespace System.Windows.Extensions { @@ -12,12 +15,32 @@ namespace System.Windows.Extensions where T : Window { protected IServiceManager ServiceManager { get; } = new ServiceManager(); + protected ILoggerFactory LoggerFactory { get; private set; } public ExtendedApplication() { this.RegisterInternals(); } + /// + /// Do some work on the before calling . + /// + protected virtual void SetupServiceManager(IServiceManager serviceManager) + { + serviceManager.RegisterHttpFactory(); + } + /// + /// Setup the logger factory used to create the loggers. + /// + /// By default, this method creates a with only one . + /// used to create loggers. + protected virtual ILoggerFactory SetupLoggerFactory() + { + var factory = new LoggerFactory(); + factory.AddProvider(new DebugLoggerProvider()); + return factory; + } + /// /// Called right before the window is shown. /// @@ -41,6 +64,9 @@ namespace System.Windows.Extensions protected sealed override void OnStartup(StartupEventArgs e) { this.SetupExceptionHandling(); + this.LoggerFactory = this.SetupLoggerFactory(); + this.ServiceManager.RegisterSingleton(_ => this.LoggerFactory); + this.SetupServiceManager(this.ServiceManager); this.RegisterServices(this.ServiceManager); this.SetupApplicationLifetime(); this.LaunchWindow(); @@ -66,6 +92,7 @@ namespace System.Windows.Extensions { this.ServiceManager.RegisterServiceManager(); this.ServiceManager.RegisterSingleton(); + this.ServiceManager.RegisterResolver(new LoggerResolver()); } private void SetupExceptionHandling() { diff --git a/WpfExtended/Logging/LoggerResolver.cs b/WpfExtended/Logging/LoggerResolver.cs new file mode 100644 index 0000000..7a56861 --- /dev/null +++ b/WpfExtended/Logging/LoggerResolver.cs @@ -0,0 +1,46 @@ +using Microsoft.Extensions.Logging; +using Slim.Resolvers; +using System.Linq; + +namespace System.Windows.Extensions.Logging +{ + public sealed class LoggerResolver : IDependencyResolver + { + public bool CanResolve(Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ILogger<>) || + type == typeof(ILogger)) + { + return true; + } + + return false; + } + + public object Resolve(Slim.IServiceProvider serviceProvider, Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ILogger<>)) + { + return ResolveScopedLogger(serviceProvider, type); + } + else + { + return ResolveLogger(serviceProvider, type); + } + } + + private static object ResolveScopedLogger(Slim.IServiceProvider serviceProvider, Type type) + { + var loggerFactory = serviceProvider.GetService(); + var categoryTypes = type.GetGenericArguments(); + var createLoggerMethod = typeof(LoggerFactoryExtensions).GetMethods().Where(m => m.IsGenericMethodDefinition && m.Name == nameof(LoggerFactoryExtensions.CreateLogger)).First(); + return createLoggerMethod.MakeGenericMethod(categoryTypes.First()).Invoke(null, new object[] { loggerFactory }); + } + + private static object ResolveLogger(Slim.IServiceProvider serviceProvider, Type type) + { + var loggerFactory = serviceProvider.GetService(); + return loggerFactory.CreateLogger(string.Empty); + } + } +} diff --git a/WpfExtended/WpfExtended.csproj b/WpfExtended/WpfExtended.csproj index 6298723..7346952 100644 --- a/WpfExtended/WpfExtended.csproj +++ b/WpfExtended/WpfExtended.csproj @@ -6,7 +6,7 @@ true true License.txt - 0.2.1 + 0.3.0 latest Extension library for Windows Presentation Platform. @@ -83,8 +83,10 @@ http://www.java2s.com/Open-Source/CSharp_Free_Code/Windows_Presentation_Foundati - - + + + +