2017-11-23 1 views
2

私はasp.netコアで行われたすべてのログにテナント名を追加しようとしています。 マルチテナントにSasskitを使用しています。MultiTenantカスタムILogger - シングルトンからスコープサービスを使用することはできません

また、一部のスコープに問題があります。私は私がこの仕事を得ることができます方法についていくつかのフィードバックをしたいと思います:

これは私のカスタムロガーです:

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'.

この作業を取得する方法上の任意のフィードバックは大歓迎です!

答えて

0

私はあなたが

services.AddSingleton<IMultiTenantProvider, MultiTenantLogger>(); 

services.AddTransient<IMultiTenantProvider, MultiTenantLogger>(); 

を交換しようとすることができますが、シングルトンまたはスコープ

の両方にする必要があると思います

関連する問題