Кстати, я пытаюсь внедрить Serilog Contextual logger инъекцию для Autofa c в моем базовом приложении Clean Architecture SPA.
Структура проекта:
В моем проекте Autofa c находится в проекте инфраструктуры 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();
}
}
и зарегистрируйте контейнер Autofa c в классе запуска, как показано ниже:
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 предоставляет реализацию для Autofa c также. Итак, я запутался, где я должен использовать фактическую реализацию Serilog в веб-проекте или инфраструктурном проекте? Должен ли я вернуть обратно весь код из моего program.cs
файла и внедрить Serilog и установить его зависимости в проекте Infrastructure, используя следующий код?
Первая установка Serilog Dependency:
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();
Простой вопрос:
Как правильно реализовать интеграцию SerilogAutofa c в моем Чистом проекте?