gpt4 book ai didi

c# - Multi-Tenancy 自定义 ILogger - 无法使用来自单例的范围服务

转载 作者:行者123 更新时间:2023-11-30 18:15:55 25 4
gpt4 key购买 nike

我正在尝试将租户名称添加到 asp.net core 完成的每个日志中。我正在使用 Sasskit用于 Multi-Tenancy 。

我遇到了一些范围问题。我想要一些关于如何让它工作的反馈:

这是我的自定义记录器:

public class MultiTenantLogger : IMultiTenantProvider
{
private AppTenant _tenant;

public MultiTenantLogger(AppTenant tenant)
{
_tenant = tenant;
}

public string GetTenantName<T>()
{
var typeDisplayName = GetTypeDisplayName(typeof(T));

if (_tenant == null)
{
return typeDisplayName;
}

return $"Tenant: {_tenant.Name}";
}

}

.

public class MultiTenantLogger<T> : ILogger<T>
{
private readonly ILogger _logger;

public MultiTenantLogger(ILoggerFactory factory, IMultiTenantProvider multiTenantProvider)
{
if (factory == null)
{
throw new ArgumentNullException(nameof(factory));
}
if (multiTenantProvider == null)
{
throw new ArgumentNullException(nameof(multiTenantProvider));
}

var category = multiTenantProvider.GetTenantName<T>();
_logger = factory.CreateLogger(category);
}

IDisposable ILogger.BeginScope<TState>(TState state) => _logger.BeginScope(state);

bool ILogger.IsEnabled(LogLevel logLevel) => _logger.IsEnabled(logLevel);

void ILogger.Log<TState>(LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
=> _logger.Log(logLevel, eventId, state, exception, formatter);
}

这是我的创业公司:

public void ConfigureServices(IServiceCollection services)
{
_services = services;
services.AddMultitenancy<AppTenant, CachingAppTenantResolver>();

services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

// Add application services.
services.AddTransient<IEmailSender, EmailSender>();

services.Configure<MultitenancyOptions>(Configuration.GetSection("Multitenancy"));

services.AddMvc();

services.AddTransient<IMultiTenantProvider, MultiTenantLogger>();
services.Replace(ServiceDescriptor.Transient(typeof(ILogger<>), typeof(MultiTenantLogger<>)));
}

我收到这个错误:

Cannot consume scoped service 'AspNetMvcSampleModels.AppTenant' from singleton 'Microsoft.AspNetCore.Hosting.IApplicationLifetime'.

欢迎就如何实现此功能提供任何反馈!

最佳答案

我认为你需要同时制作 Singleton 或 Scoped

你可以尝试更换

services.AddTransient<IMultiTenantProvider, MultiTenantLogger>();

services.AddSingleton<IMultiTenantProvider, MultiTenantLogger>();

关于c# - Multi-Tenancy 自定义 ILogger - 无法使用来自单例的范围服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452195/

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