.net5.0 PRISM WPF应用程序,如何使用 Microsoft.Exensions.Logging 以 Serilog 作为提供程序?

2024-04-13

我有一个 PRISM (8.1.97) WPF 应用程序在带有 Unity 容器的 .net5.0 上运行。

我想做的是将 Serilog 指定为我的日志记录提供程序,但注入通常的Microsoft.Extensions.Logging通过我的 DI 注册服务的构造函数记录器(例如,只需使用ILogger<MyService> logger在构造函数中)。

经过一番挖掘后我发现了一些线索here https://www.andicode.com/prism/wpf/logging/2021/05/21/Logging-In-Prism.html and here https://github.com/augustoproiete/prism-logging-serilog/issues/3#issuecomment-896902130.

其中,第二个是最直接的。基本上你添加Prism.Container.Extensions https://github.com/dansiegel/Prism.Container.Extensions然后在 App.xaml.cs 中,重写 CreateContainerExtension()。这为您提供了一种访问服务集合的方法,这看起来就像使用内置 .net 5 DI 获得的服务集合一样。

下面是 App.xaml.cs 中我的 App 类...

public partial class App : PrismApplication
{
    private IConfigurationRoot configRoot;

    protected override Window CreateShell()
    {
        // Configures logger using json config file
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configRoot)
            .CreateLogger();

        return Container.Resolve<MainWindow>();
    }


    protected override IContainerExtension CreateContainerExtension()
    {
        configRoot = new ConfigurationBuilder()
                    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: false)
                    .Build();

        IContainerExtension containerExtension = base.CreateContainerExtension();

        containerExtension.RegisterServices(
            services => 
            {
                // Makes serilog the logging provider?
                services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true)); 
            });

        return containerExtension;
    }    
    

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        // just a simple module with Views/viewModels
        var moduleAType = typeof(DevTestingModule);
        moduleCatalog.AddModule(new ModuleInfo()
        {
            ModuleName = moduleAType.Name,
            ModuleType = moduleAType.AssemblyQualifiedName,
            InitializationMode = InitializationMode.WhenAvailable
        });
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // intentionally empty
    }
}

上面似乎是合理的,但问题是当我尝试注入记录器时,例如在 MainWindow (Prism Shell)中,它给出了一个异常Container.Resolve<MainWindow>();在 App.xaml.cs 中的 CreateShell() 中。

这是我的 MainWindow.xaml.cs 类,当我尝试注入记录器时......

public partial class MainWindow : Window
{
    private readonly ILogger<MainWindow> log;

    public MainWindow(ILogger<MainWindow> log)
    {
        InitializeComponent();
        this.log = log;
        log.LogInformation("hello?");
    }
}

例外是Prism.Ioc.ContainerResolutionException最值得注意的内部例外是......

System.IServiceProvider 类型没有可用的公共构造函数。

我想我搞砸了一些事情,但我不确定我是否走在正确的轨道上。看来是有意为之CreateContainerExtension()Prism.Container.Extensions 的覆盖是给我一个 IServiceCollection,可以像在 .net 5 的 Microsoft DI 中一样使用。我是否误解了它?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net5.0 PRISM WPF应用程序,如何使用 Microsoft.Exensions.Logging 以 Serilog 作为提供程序? 的相关文章

  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 检测节点的系统路径上是否存在可执行文件

    Question 有没有一种简单的方法可以使用节点判断系统可执行文件在系统路径上是否可用 例如 如果用户安装了 python usr bin python and usr bin is in PATH我如何在 Node 中检测到这一点 相反
  • 在 Filter 内执行并呈现 JSP

    我有一个包含页面顶部内容的 JSP 我们将其称为 header jsp 出于性能原因 我想在构建页面的其余部分之前呈现此 JSP 并将其刷新给用户 看here http developer yahoo com performance rul
  • 元素不可点击错误 Ruby / Watir

    在我的测试中 我尝试访问 etsy com 进行搜索 单击结果 然后将商品添加到我的购物车 我可以做所有事情 直到我尝试单击 添加到购物车 按钮 下面的代码实际上在 IRB 中工作 所以我知道我的定位器是可靠的 但是当我运行测试时 我得到一
  • 在 Elasticsearch 中过滤折叠结果

    我有一个弹性搜索索引 其中包含表示给定时间点实体的文档 当实体更改状态时 会创建带有时间戳的新文档 当我需要获取所有实体的当前状态时 我可以执行以下操作 GET https 127 0 0 1 9200 myindex search col
  • .NET RIA 服务与 MVC 风格存储库?

    我有一个包含多个项目的解决方案 包括两个共享位于外部程序集中 也在同一解决方案中 的存储库和模型的 asp net mvc 项目 本质上 Core 存储库 楷模 国内 Web 基本MVC站点 引用核心项目 国际网 基本MVC站点 引用核心项
  • 使用 NativeMessaging 进行边缘扩展

    我有一个具有本机消息传递支持的边缘扩展 它与系统中运行的 uwp 应用程序进行通信 是否必须将扩展打包到 uwp 应用程序的 appx 文件夹中 如果没有 那么我们如何将扩展上传到边缘扩展存储中 我遵循 secureInput 示例 htt
  • 快速向 SQL Server 插入 200 万行

    我必须从文本文件中插入大约 200 万行 通过插入 我必须创建一些主表 将如此大的数据集插入 SQL Server 的最佳且快速的方法是什么 我认为最好读取 DataSet 中文本文件的数据 试用SQL批量复制 从 C 应用程序批量插入 S
  • GSON反序列化:如何知道对象?

    我尝试使用 gson 库来反序列化发送给我的对象流 在我见过的所有示例中 当调用 fromJson 方法时 我们已经知道我们期望拥有什么类型的对象 就我而言 我收到不同对象的流 我想知道在反序列化对象之前了解对象类的最佳方法 A B B1
  • Android 自定义通知布局与 RemoteViews

    我正在尝试使用此为我的 Android 应用程序创建自定义通知post https stackoverflow com questions 18367631 change notification layout 我偶然发现了一个我在过去 2
  • 使用 LIMIT 时获取总行数? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 offset limit 查找 mySQL 查询中的结果总数 https stackoverflow com questions 5928611 find total number of res
  • JAX-RS自定义ExceptionMapper不拦截RuntimeException

    我想包裹底层RuntimeExceptions自定义 json 格式 使得 servlet 容器不会将堆栈跟踪转储到客户端 我关注这个问题 使用 XML 或 JSON 的 JAX RS Jersey 自定义异常 https stackove
  • 强制 MySQL 在连接上使用两个索引

    我试图强制 MySQL 使用两个索引 我正在加入一个表 我想利用两个索引之间的交叉 具体术语是 Using intersect 这里是 MySQL 文档的链接 http dev mysql com doc refman 5 0 en ind
  • Xamarin 表单:从 Xamarin Forms 应用程序启动 IOS 应用程序时出现问题(输入 URL 无效)

    我正在尝试从我的 xamarin forms ios 应用程序打开一个 ios 应用程序 我已经提到过this https stackoverflow com questions 43944283 launch another ios ap
  • 使用 NuGet 安装 NHibernate 3.2

    我是 NHibernate 的新手 一直在尝试使用 NuGet 来启动和运行它 Fluent NHibernate 和 NProf 读完这篇文章后 http gurustop net blog 2011 03 13 nhibernate 3
  • SVGforeignObject 无法在任何浏览器上显示,为什么?

    我在 SVG 元素中有一个foreignObject 所有其他元素都会显示 但foreignObject 及其内容是不可见的 在 Chrome Firefox 和 Edge 中进行了测试 结果均相同 这是代码
  • 尝试使用 PHP 通过 HMAC-SHA1 进行数字签名

    我正在尝试设置一些 Google Maps Premier API 操作 为此 我需要对我的网址进行签名以进行身份 验证 如果您查看签名示例 可以看到一些 Python C 和 Java 代码向您展示如何通过 HMAC SHA1 进行签名
  • IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

    我花了好几个小时思考曝光名单成员的问题 在与我类似的问题中 乔恩 斯基特 Jon Skeet 给出了很好的答案 请随意看看 ReadOnlyCollection 或 IEnumerable 用于公开成员集合 https stackoverf
  • 这个值应该被释放吗?

    我在 IOS 模拟器中遇到了 segfault 11 内存访问错误 但当我在下面的代码中注释掉该版本时 该错误消失了 get get the question number NSString text attributeDict value
  • 减少knitr块中命令和输出之间的空间

    我在用着knitr with LaTeX并且代码块回显的命令与输出的开头之间似乎有很多空间 LaTeX 代码如下所示 begin knitrout scriptsize definecolor shadecolor rgb 1 1 1 co
  • .net5.0 PRISM WPF应用程序,如何使用 Microsoft.Exensions.Logging 以 Serilog 作为提供程序?

    我有一个 PRISM 8 1 97 WPF 应用程序在带有 Unity 容器的 net5 0 上运行 我想做的是将 Serilog 指定为我的日志记录提供程序 但注入通常的Microsoft Extensions Logging通过我的 D