Решение
Все, что мне нужно, это возможность использовать ленивый dbContext или нетерпеливый dbContext
Вы должны иметь возможность просто установить конфигурацию в подклассах:
public class LazyContext : MyContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
}
}
public class EagerContext : MyContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
}
Существует два варианта настройки конфигурации параметра db: через конструктор (и, следовательно, маршрут DI) или через сам класс. Поскольку этот конкретный параметр является специфичным для класса c, и вы не хотите манипулировать им при регистрации DI, имеет смысл полагаться на метод конфигурации c, специфичный для класса.
Почему ваше решение не сработало
Причина, по которой ваш первоначальный подход не сработал, заключается в том, что AddDbContext<T>
регистрирует , в котором c T
указан тип вашей зависимости. Из источника:
Метод расширения AddDbContext по умолчанию регистрирует типы DbContext с ограниченным временем жизни.
Обратите внимание, что он регистрирует тип контекста, а не какие-либо интерфейсы / предки этот тип контекста.
Итак, когда вы это сделаете:
services.AddDbContext<LazyUserContext>((sp, opt) =>
{
var connectionString = "very secret";
opt.UseSqlServer(connectionString, x => x.CommandTimeout(300));
opt.UseLazyLoadingProxies();
});
services.AddScoped<ILazyUserContext, LazyUserContext>();
Если ваш класс имеет зависимость типа ILazyUserContext
, он прослушивает только вторую регистрацию, а Flatout игнорирует первую .
Только когда ваш класс имеет зависимость LazyUserContext
, вы действительно получите параметры контекста базы данных, указанные при первой регистрации.
Обратите внимание, что вы можете использовать этот тип с указанием c поведение регистрации в ваших интересах, когда вы хотите зарегистрировать реализацию по умолчанию:
// Specific interface => specific type
services.AddScoped<IUserContext, UserContext>();
services.AddScoped<ILazyUserContext, LazyUserContext>();
// General interface => explicitly chosen default type
services.AddScoped<IContext, UserContext>();
Это позволяет вам иметь некоторые классы, требующие особой нетерпеливой / ленивой загрузки, и другие классы, которые просто принимают независимо от того, что является значением по умолчанию (которое может измениться со временем).