【问题标题】:MultiTenant custom ILogger - cannot consume scoped service from singletonMultiTenant 自定义 ILogger - 无法使用单例的范围服务
【发布时间】:2017-11-23 09:42:26
【问题描述】:

我正在尝试将租户名称添加到由 asp.net 核心完成的每个日志中。 我将Sasskit 用于多租户。

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

这是我的自定义记录器:

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<>)));
}

我收到此错误:

无法使用范围服务“AspNetMvcSampleModels.AppTenant” 来自单例“Microsoft.AspNetCore.Hosting.IApplicationLifetime”。

欢迎任何有关如何使其工作的反馈!

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc saaskit


    【解决方案1】:

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

    你可以尝试替换

    services.AddTransient<IMultiTenantProvider, MultiTenantLogger>();
    

    services.AddSingleton<IMultiTenantProvider, MultiTenantLogger>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2020-08-05
      相关资源
      最近更新 更多