您现在的位置是:主页 > news > 深圳网站建房/在线数据分析网站
深圳网站建房/在线数据分析网站
admin2025/5/10 17:05:48【news】
简介深圳网站建房,在线数据分析网站,企业服务公司经营范围,海口 网站制作公司首先说明一下,NebuLogWpfCoreSample示例采用了基于.NET Core的WPF框架而不是原来的.Net Framework框架。之所以这么做是因为微软本来就说WPF将来也会向.NET 5靠拢,而原来的旧框架架构设计思维已经相对落后,作为一个踩坑的探索项目,…

首先说明一下,NebuLogWpfCoreSample示例采用了基于.NET Core的WPF框架而不是原来的.Net Framework框架。之所以这么做是因为微软本来就说WPF将来也会向.NET 5靠拢,而原来的旧框架架构设计思维已经相对落后,作为一个踩坑的探索项目,NebuLog肯定是把时间资源往前瞻性技术方向上分配。
目前NebuLogWpfCoreSample示例写的不多,因为时间关系,并且在WPF套用http://Asp.Net Core MVC结构的尝试上也不顺利,总有一些意想不到的错误。可能是我对.Net Core了解太浅,所以这里分享出来也希望得到相关高手的指点。
基本想法
这个示例尝试采用类似于http://Asp.Net Core网站项目那样的Hosting、依赖注入方式来创建和管理日志logger。因此,不同于原来WPF中APP.cs -> MainWindow.cs这样的运行流程,而是在App中调用ConfigureServices和Configure方法,在其中注册INebuLogger和NebuLogProvider:
public App(){IServiceCollection services = new ServiceCollection();ConfigureServices(services);this.Configure(services);}
然后再通过WPF的App.Xaml中配置的Startup="OnStartup"回调参数引导运行流程回到OnStartup()方法,再向服务框架请求MainWindow实例:
protected void OnStartup(object sender, StartupEventArgs e){var mainWindow = serviceProvider.GetService<MainWindow>();mainWindow.Show();}
最后在MainWindow的构造函数里面,向依赖注入框架请求ILogger实例,拿到后就可以用这个logger进行设想的日志输出了:
public MainWindow( INebuLogger logger) : base()
问题
但是实际运行下来发现并不像设想那样简单。主要问题是,虽然代码编译能够通过,却无法在MainWindow构造函数中获得INebuLogger或者ILogger的实例,拿到的只是一个null。
最后妥协的办法是另外写了ServiceCollectionExtensions和LoggerFactoryExtensions的扩展函数,以及一个NebuLogWpfProvider。与http://Asp.Net core网站项目不一样的是,原来的NebuLogProvider只需要一个Option配置参数,hubConnection由框架在需要的时候进行连接,而NebuLogWpfProvider需要在构造时获得一个有效的HubConnection。
public static void UseNebuLogWpf(this ILoggerFactory factory, NebuLogOption nebulogOption, HubConnection hubConnection){factory.AddProvider(new NebuLogWpfProvider(nebulogOption, hubConnection));}
public static void UseNebuLogWpf<T>(this ILoggerFactory factory, NebuLogOption nebulogOption, HubConnection hubConnection){factory.AddProvider(new NebuLogWpfProvider(nebulogOption, hubConnection));}
这样做了在MainWindow中也还无法获得logger实例,但是能够获得ILoggerFactory实例了,通过其CreateLogger()方法,就能够得到一个logger了:
_logger = factory.CreateLogger(this.GetType().Name);
不过这个logger只是一个ILogger接口的实例,因此只能调用ILogger规定的方法,比如Log<T>(),而不能使用INebuLogger接口规定的扩展方法,也无法从WPF应用层获得完整的运行记录。
不过,由于INebuLogger实际上已经注册到了LoggerFactory(尽管还没找到获取INebuLogger实例的方法),因此WPF运行时输出的日志也能够静默地输出到NebuLog服务端了,包括应用级别产生的exception:

后续想法
因为目前的WPF core示例还没有像http://Asp.Net Core MVC示例那样获取到丰富的应用层级日志,后续如果时间允许的话,可以从以下想法去改进目前这个WPF示例:
- 利用WPF应用预定义的一些事件回调,例如Exit += OnExit;
- 利用System.Diagnostics库获取信息,例如通过System.Diagnostics.Debug.Print这样的方法获取运行信息;
- 利用Trace.Listeners获取信息
目前看到一些文章可能有助于后续的拓展,尚未来得及细看:
微软官方关于如何获取程序信息流的介绍
https://support.microsoft.com/zh-cn/help/815788/how-to-trace-and-debug-in-visual-csupport.microsoft.comTraceSource Class
TraceSource Class (System.Diagnostics)docs.microsoft.com
WPF 调试方法
[转]WPF 调试方法 - DotNet编程 - 博客园www.cnblogs.com
当然,从实用性角度而言,调试WPF最好的可能是Visual Studio自带工具了,如果为了运营日志记录的目的,则可以使用许多完善的商业级日志工具。NebuLog本质上来说是一个技术探索的小项目,是否有继续写下去的价值,只有将来才能知道了。