Неожиданное поведение ILoggerFactory в EF Core - PullRequest
0 голосов
/ 19 января 2019

Мне нужно добавить регистратор для уточнения dbContext.Например, у меня есть следующий код:

var dbContextOptionsBuilder1 = new DbContextOptionsBuilder();
dbContextOptionsBuilder1.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext1 = new DbContext(dbContextOptionsBuilder1.Options);
var loggerFactory1 = dbContext1.GetService<ILoggerFactory>();
loggerFactory1.AddProvider(new CustomLoggerProvider());

var dbContextOptionsBuilder2 = new DbContextOptionsBuilder();
dbContextOptionsBuilder2.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext2 = new DbContext(dbContextOptionsBuilder2.Options);
var loggerFactory2 = dbContext2.GetService<ILoggerFactory>();

Если я раскрою непубличные члены loggerFactory1, я увижу добавленный мной CustomLoggerProvider (_providerRegistrations = Count = 1).Но если я раскрою непубличные члены loggerFactory2, то у меня появится тот же CustomLoggerProvider (_providerRegistrations = Count = 1), хотя я не добавил его в dbContext2.

Также у меня появилось другое неожиданное поведение вследующий код:

public class MyDbContext : DbContext
{
    private readonly IDbService dbService;
    public MyDbContext(IDbService dbService, DbContextOptions options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

    }
}

var dbContextOptionsBuilder1 = new DbContextOptionsBuilder();
dbContextOptionsBuilder1.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext1 = new DbContext(dbContextOptionsBuilder1.Options);
var loggerFactory1 = dbContext1.GetService<ILoggerFactory>();
loggerFactory1.AddProvider(new CustomLoggerProvider());

var dbContextOptionsBuilder2 = new DbContextOptionsBuilder();
dbContextOptionsBuilder2.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext2 = new DbContext(dbContextOptionsBuilder2.Options);
var loggerFactory2 = dbContext2.GetService<ILoggerFactory>();

var dbContextOptionsBuilder3 = new DbContextOptionsBuilder();
dbContextOptionsBuilder3.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext3 = new MyDbContext(new DbService(), dbContextOptionsBuilder3.Options);
var loggerFactory3 = dbContext3.GetService<ILoggerFactory>();
loggerFactory3.AddProvider(new CustomLoggerProvider());

var dbContextOptionsBuilder4 = new DbContextOptionsBuilder();
dbContextOptionsBuilder4.UseSqlServer("Data Source=localhost;Initial Catalog=DataBase;Integrated Security=True");
var dbContext4 = new MyDbContext(new DbService(), dbContextOptionsBuilder4.Options);
var loggerFactory4 = dbContext4.GetService<ILoggerFactory>();

В этом случае я получил 1 CustomLoggerProvider в dbContext3 (_providerRegistrations = Count = 1) и тот же регистратор в dbContext4 (_providerRegistrations = Count = 1).Таким образом, нет никакой связи между dbContext1, dbContext2 и dbContext3, dbContext4.Поэтому, если я добавлю еще один CustomLoggerProvider к dbContext1, я получу следующий результат:

dbContext1: 2 CustomLoggerProvider (_providerRegistrations = Count = 2)
dbContext2: 2 CustomLoggerProvider (_providerRegistrations = Count = 2)
dbContext3: 1 CustomLoggerProvider (_providerRegistrations = Count = 1)
dbContext4: 1 CustomLoggerProvider (_providerRegistrations = Count = 1)

Как правильно работать с ILoggerFactory?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...