2017-11-23 10 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 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'.

이 작업을하는 방법에 대한 모든 의견을 환영합니다

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

내 시작입니다!

답변

0

난 당신이 싱글 또는 범위가 지정된

모두

당신이

services.AddSingleton<IMultiTenantProvider, MultiTenantLogger>(); 

services.AddTransient<IMultiTenantProvider, MultiTenantLogger>(); 

을 대체하려고 할 수 있도록 할 필요가 있다고 생각