Обратите внимание, что HomeController
не LocalDbContext
напрямую, а только использует его, чтобы передать его в свою зависимость real , LocalDb
. Следовательно, вы не должны вставлять LocalDbContext
в конструктор HomeController
, а вместо этого вводить LocalDb
напрямую. Это решает ваши проблемы элегантно, потому что теперь LocalDb
может быть зарегистрирован в контейнере DI, и он может разрешить его для вас с любой зависимостью, которую он может иметь.
Вот пример HomeController
, который зависит от LocalDb
напрямую.
public class HomeController : Controller
{
private readonly LocalDb _db;
public HomeController(LocalDb db)
{
_db = db;
}
public IActionResult GetSomeData(int id)
{
return Ok(_db.GetSomeDataById(id));
}
}
Поскольку LocalDb
вводится в конструктор, он должен быть зарегистрирован в контейнере DI:
services.AddTransient<LocalDb>();
services.AddDbContext<LocalDbContext>(options =>
{
options.UseSqlServer(builderLocal.ConnectionString);
});
Но поскольку LocalDb
состоит из DI-контейнер, он может быть расширен любыми зависимостями, такими как ILogger
зависимость:
public class LocalDb
{
private readonly LocalDbContext _context;
private readonly ILogger<LocalDb> _logger;
public LocalDb(LocalDbContext context, ILogger<LocalDb> _logger)
{
_context = context;
_logger = logger;
}
...
}
TIP: Предотвращение спринклинговых операторов catch
в базе кода, которые регистрируются и повторно выдать. Вместо этого предпочтительнее иметь некоторую глобальную инфраструктуру, которая регистрирует любые неудачные запросы. Если я не ошибаюсь ASP. NET Core сделает это за вас из коробки. Если нет, это можно включить всего несколькими строками кода. Это значительно упрощает код (например, LocalDb.AddStudent
) и ограничивает число зависимостей, которые имеет класс.