为WPF框架Prism注册Nlog日志服务

无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法。

尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展。

但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现在这个基础上实现依赖注入,首先我们需要修改Prism当中创建容器的默认实现, 在其中将ServiceCollection追加到容器当中。

本文的示例主要以DryIoc容器为示例:

这里会主要用到几个相关的依赖:

  • Microsoft.Extensions.DependencyInjection;
  • Microsoft.Extensions.Logging;
  • DryIoc.Microsoft.DependencyInjection;
  • NLog.Extensions.Logging;

为此, 需要添加一些相关的包,如下所示:

Nlog.Config: 主要配置Nlog的执行配置,规则

NLog.Extensions.Logging: 扩展方法, 用于注册服务

在App.xaml.cs代码,如下所示:

        protected override IContainerExtension CreateContainerExtension()
        {
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddLogging(configure =>
            {
                configure.ClearProviders();
                configure.SetMinimumLevel(LogLevel.Trace);
                configure.AddNLog();
            });

            return new DryIocContainerExtension(new Container(CreateContainerRules())
                .WithDependencyInjectionAdapter(serviceCollection));
        }

窗口中,添加测试代码:

    public partial class MainWindow : Window
    {
        private readonly Logger<MainWindow> logger;

        public MainWindow(Logger<MainWindow> logger)
        {
            InitializeComponent();
            this.logger = logger;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            logger.LogDebug("Hello");
        }
    }

注意: 配置Nlog需要修改Nlog.Config配置文件生效,可参考Github文档, 下面为测试配置:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <targets>
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"  />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="f" />
  </rules>
</nlog>

最终输出内容,如下所示:

2021-08-19 16:32:00.5558|0|DEBUG|wpflogapp.MainWindow|Hello
2021-08-19 16:32:00.7049|0|DEBUG|wpflogapp.MainWindow|Hello
2021-08-19 16:32:00.8828|0|DEBUG|wpflogapp.MainWindow|Hello
2021-08-19 16:32:01.0647|0|DEBUG|wpflogapp.MainWindow|Hello
2021-08-19 16:32:01.2608|0|DEBUG|wpflogapp.MainWindow|Hello 

完整App.xaml.cs文件代码如下:

    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        { }
        protected override IContainerExtension CreateContainerExtension()
        {
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddLogging(configure =>
            {
                configure.ClearProviders();
                configure.SetMinimumLevel(LogLevel.Trace);
                configure.AddNLog();
            });

            return new DryIocContainerExtension(new Container(CreateContainerRules())
                .WithDependencyInjectionAdapter(serviceCollection));
        }
    }

到此这篇关于为WPF框架Prism注册Nlog日志服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WPF框架Prism中模块Module用法

    什么是模块(Module)? 本质上来说, 对于一个应用程序而言, 特定功能的所有View.Logic.Service等都可以独立存在.那么意味着, 每个独立的功能我们都可以称之为模块.而往往实际上, 我们在一个项目当中, 他的结构通常是如下所示: 所有的模块都在一个项目当中, 这使得应用程序当中, 我们难以区分单独的模块, 它们似乎变成了一个整体. 所以,当我们开始考虑划分模块之间的关系的时候, 并且采用新的模块化解决方案, 它的结构将变成如下所示: 该项目包含了一个启动页, 并且在启动页当中

  • WPF框架Prism中区域Region用法介绍

    什么是区域(Region)? 在理解这个之前, 首先需要了解一下, 在最常见的开发模式当中, 我们去设计某个页面的时候, 实际上界面元素在设计的时候已经被固定. 举个简单的例子,当我们去设计如下页面, 它包含Header.Menu.Content内容. 因此我们可以为这个页面设计一些元素, 例如: 1.Menu 可以放置ListBox 2.Content 可以放置一个ContentControl 3.Header 可以放置一些ToolBar 注:为了演示需要, 对应区域的控件均采用TextBlo

  • WPF框架Prism中使用MVVM架构

    常见的MVVM框架 众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知.绑定.命令等功能. 对于不同的MVVM框架而言, 大体使用上会在声明方式上的差异, 以及特定功能上的差别. 下面列举了常用的3个MVVM框架,他们的一些差异.如下所示: 功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm 通知 BindableBase ViewMode

  • WPF框架Prism中View Injection用法介绍

    View View通常指的是, 我们定义的页面, 而在模块化的系统当中, 我们往往称之为用户控件(UserControl).对于模块化系统而言, 每个模块当中都有N个用户控件组成, 然后模块向区域当中注册视图. View Injection 在介绍Region章节当中所讲到, RegionManager的功能: 维护区域集合 提供对区域的访问 合成视图 区域导航 定义区域 这意味着, 我们可以在模块当中为区域指定视图, 这个时候,我们就可以通过依赖注入的方式,使用IRegionManager接口

  • WPF框架Prism中导航Navigation用法介绍

    使用场景 在普遍的业务场景当中, 必不可少的是页面切换, 而Prism就可以使用Navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证.传递参数.返回上一页.返回下一页等功能. 导航的基本条件 1.注册显示区域 2.注册导航页面 1.注册导航 注册视图类型或添加别名, 如果为指定别名,名称默认为当中类型的名称 public class ModuleAModule : IModule { public void OnInitialized(IContainer

  • WPF框架Prism中ViewModelLocator用法介绍

    建立连接 在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示: 建立连接的方式 如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行: XAML设置 Code设置 (构造函数注入 或 ViewModelLocator) XAML的方式: <UserControl.DataContext> <.../> </UserControl.DataContext> 代码的方式:

  • WPF框架Prism中对话框Dialog用法介绍

    什么是Dialog? 对话框实际上是我们应用程序经常用到的一个功能, 类如: Show.ShowDialog. 可以弹出一个我们指定的窗口, 仅此而已, 那么在Prism当中, Dialog指的是什么? Prism提供了一组对话服务, 封装了常用的对话框组件的功能, 例如: RegisterDialog/IDialogService (注册对话及使用对话) 打开对话框传递参数/关闭对话框返回参数 回调通知对话结果 创建Dialog流程 创建对话框,通常是一组用户控件 ,并且实现 IDialogA

  • WPF创建Prism应用程序

    创建Prism应用程序 1.第一步 首先, 创建一个基于.NetFramework 或.NetCore的WPF应用程序.如下所示: 2.第二步 为当前应用程序添加NuGet源, 打开NuGet管理器,安装Prism.DryIoc, 如下所示: 说明: 本文将以DryIoc容器为主讲解本系列的所有内容. 实际上, 在Prism7.2版本中, 已经引入了一些围绕IOC抽象的API更改.这最终将使得在选择容器之间切换更加容易,因为 API 在如何注册服务和视图方面完全相同. 您仍然可以访问容器,在 A

  • WPF框架之Prism介绍

    什么是Prism? Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架. Prism历史 他最初由Microsoft Patterns & Practices 团队构建的项目, 目的是帮助WPF开发人员以简化编写.维护和扩展来设计应用程序.目前它是属于.NET基金会下的一个开源项目.并且经过财富100强等公司的多年的实践考验. Github https://github.com/PrismLibrary/

  • 为WPF框架Prism注册Nlog日志服务

    无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展. 但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现在这个基础上实现依赖注入,首先我们需要修改Prism当中创建容器的默认实现

  • Nlog日志框架集成Seq扩展包

    什么是Seq? 正如我们使用不同的日志框架来为我们的应用程序收集各类日志信息, 这些信息可以有效的帮助我们快速诊断应用程序中发生的各类问题, 尽管如此,对于常见的日志框架而言, 它们往往只是解决了日志功能快速集成以及如何配置输出保存等功能. 对于那些不间断运行的应用程序而言, 日志的存储和维护工作会变得异常麻烦, 如果想灵活的在不同时间段去查找日志, 根据不同的日志类型快速的定位问题, 这会变得非常困难,所以为了解决这些问题, Seq就登场了.Seq提供了收集应用程序日志.搜索过滤.警告以及图表

随机推荐