我建议您对记录器和所有其他依赖项使用依赖项注入 (DI)。在 WPF 中,您可以用作Application_Startup注册所有依赖项的“组合根”。
此示例使用 Castle Windsor 进行 DI,但您可以使用您的选择。这里的记录器是 Serilog,但同样,您使用哪个并不重要:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
private async void Application_Startup(object sender, StartupEventArgs e)
{
ILogger log = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.File(path: logFolder, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true)
.CreateLogger();
var ioc = new WindsorContainer();
ioc.Register(Castle.MicroKernel.Registration.Component.For<ILogger>().Instance(log));
ioc.Register(Castle.MicroKernel.Registration.Component.For<SomeDependency...>().ImplementedBy<SomeDependency Implementation...>());
ioc.Register(Castle.MicroKernel.Registration.Component.For<SomeDependency...>().ImplementedBy<SomeDependency Implementation...>());
ioc.Register(Castle.MicroKernel.Registration.Component.For<MainWindow>().ImplementedBy<MainWindow>());
//... etc.
var window = ioc.Resolve<MainWindow>();
window.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
任何需要记录的东西都可以ILogger在构造函数中声明一个,只要 Type 也通过 DI 解析,它就会得到一个实例:
public class SomeClassThatLogs
{
private readonly ILogger _logger;
public SomeClassThatLogs(ILogger logger)
{
_logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
我不打算将此答案作为有关 DI 的课程,您可能需要研究它,但这是在 WPF 中使用 DI 的一种方法。
| 归档时间: |
|
| 查看次数: |
13366 次 |
| 最近记录: |