gpt4 book ai didi

c# - 在 Clean Architecture 中为 Autofac 实现 Serilog 上下文记录器注入(inject)的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 23:08:20 28 4
gpt4 key购买 nike

至此,我正在尝试在我的 Clean Architecture SPA 核心应用程序中为 Autofac 实现 Serilog 上下文记录器注入(inject)。
项目结构:
enter image description here
enter image description here
在我的项目中,Autofac 位于 Infrastructure CL 项目中,如下所示:
引用代码:

public static class ContainerSetup
{
public static IServiceProvider InitializeWeb(Assembly webAssembly, IServiceCollection services) =>
new AutofacServiceProvider(BaseAutofacInitialization(setupAction =>
{
setupAction.Populate(services);
setupAction.RegisterAssemblyTypes(webAssembly).AsImplementedInterfaces();
}));

public static Autofac.IContainer BaseAutofacInitialization(Action<ContainerBuilder> setupAction = null)
{
var builder = new ContainerBuilder();

var coreAssembly = Assembly.GetAssembly(typeof(BaseEntity));
var infrastructureAssembly = Assembly.GetAssembly(typeof(P2PRepository));
builder.RegisterAssemblyTypes(coreAssembly, infrastructureAssembly).AsImplementedInterfaces();

setupAction?.Invoke(builder);
return builder.Build();
}
}
并在 Startup 类中注册 Autofac 容器,如下所示:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));

services.AddDefaultIdentity<ApplicationUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();

services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

return ContainerSetup.InitializeWeb(Assembly.GetExecutingAssembly(), services);
}
我已经尝试了什么?
我已经在我的网络项目中成功实现了 Serilog
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(
@"D:\home\LogFiles\Application\myapp.txt",
rollingInterval: RollingInterval.Day,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
)
.CreateLogger();

try
{
Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
}
在 serilog 及其依赖项之上实现之后,我发现 Serilog 正在为 Autofac 提供实现还。所以,我很困惑在 Web 项目或基础设施项目中应该在哪里使用 Serilog 的实际实现?我应该从我的 program.cs 中恢复所有代码吗?文件并实现 Serilog 并使用以下代码在基础设施项目中安装它的依赖项?
首先安装 Serilog 依赖:

Install-Package AutofacSerilogIntegration

Then when configuring the Autofac container, call RegisterLogger():

Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();

var builder = new ContainerBuilder();

var coreAssembly = Assembly.GetAssembly(typeof(BaseEntity));
var infrastructureAssembly = Assembly.GetAssembly(typeof(P2PRepository));
builder.RegisterAssemblyTypes(coreAssembly, infrastructureAssembly).AsImplementedInterfaces();

setupAction?.Invoke(builder);
builder.RegisterLogger(); // Here register serilog
return builder.Build();
简单的问题是:
在我的 Clean 项目中实现 SerilogAutofac 集成的正确方法是什么?

最佳答案

What is the proper way to implement SerilogAutofac integration in my Clean project?



这是基于意见的问题,这意味着没有单一的答案。

我的 意见,请记住,要为 Autofac 实现 Serilog 上下文记录器注入(inject),您正在执行 两个 事物:
  • 添加 Serilog
  • 使用 Autofac
  • 添加上下文记录器
    Main中的代码是 for the first purpose as per the instruction .请记住,这纯粹是与 ASP.Net Core 集成的 Serilog。因此,到目前为止,还没有涉及 Autofac。也就是说,如果您从项目中删除 Autofac 依赖项,您的应用程序应该仍然使用 Serilog。
    ContainerSetup中的代码是您将 Autofac 引入 ASP.NET Core 的地方,从那时起,ASP.NET Core 知道将 Autofac 用作 DI 容器。如果你想 使用 Autofac 专门配置上下文记录器,然后 ContainerSetup是这样做的正确地方。

    话虽如此,为了帮助决定在哪里配置记录器,问自己一个简单的问题:

    无论 Autofac 如何,您都想要 Serilog 吗?

    如果是,则不要在 Autofac 特定类型中初始化 Serilog 记录器。

    关于c# - 在 Clean Architecture 中为 Autofac 实现 Serilog 上下文记录器注入(inject)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60848130/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com