У меня есть веб-приложение ASP.NET Core, в которое я добавил DbContext:
string connectionString = builder.Configuration
.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<HomeNotificationsDbContext>(options => options.UseSqlServer(connectionString));
builder.Services.AddHomeNotificationApplicationServices(typeof(IUserService));
Метод AddHomeNotificationApplicationServices — это метод расширения, который регистрирует все мои сервисы посредством отражения как ограниченные. Это запускается просто отлично. Но всякий раз, когда я пытаюсь запустить его вместе с веб-API, где регистрирую одни и те же службы одним и тем же методом, я получаю следующую ошибку:
Не удалось разрешить службу для типа HomeNotifications.Data.HomeNotificationsDbContext при попытке активировать HomeNotifications.Services.Data.HomeAuthenticationService.
HomeAuthenticationService использует внедрение зависимостей для создания экземпляра DbContext, доступного только для чтения:
public class HomeAuthenticationService : IHomeAuthenticationService
{
private readonly HomeNotificationsDbContext dbContext;
public HomeAuthenticationService(HomeNotificationsDbContext dbContext)
{
this.dbContext = dbContext;
}
// ...
}
Я попытался добавить DbContext в качестве службы в API, так как у меня нет доступа к настройкам конфигурации веб-приложения, но это не сработало. Я мог бы добавить строку подключения в файл конфигурации API, но не уверен, что это правильный подход, поскольку я новичок в разработке. Любые советы будут оценены по достоинству.
Обновлено: Чтобы добавить дополнительные пояснения, мои DbContext, Web и Web API находятся в разных библиотеках классов. DbContext инициализируется с помощью DI в моих службах, а мои службы снова инициализируются с помощью DI на страницах веб-API и Razor. Изображение для справки:
Как объяснено в ответе на комментарий ниже, я решил свою проблему, зарегистрировав службы только в Web Program.cs и не выполняя регистрацию в Web API Program.cs.





Я попытался добавить DbContext в качестве службы с ограниченной областью в API, поскольку я у вас нет доступа к настройкам конфигурации веб-приложения, но это не сработало. Я мог бы добавить строку подключения в API Файл конфигурации,
Что ж, судя по вашему сценарию и описанию, я устал исследовать вашу проблему и не смог воспроизвести возникшую ошибку.
Основываясь на моем тесте, я думаю, вам следует проверить несколько вещей.
Прежде всего, если DbContext зарегистрирован один раз в файлах Program.cs обоих приложений вне метода регистрации общего сервиса AddHomeNotificationApplicationServices. Это влечет за собой перемещение регистрации HomeNotificationsDbContext в метод ConfigurationServices обоих файлов Program.cs и исключение ее из логики регистрации метода расширения.
Поступая таким образом, вы предотвращаете дублирование регистрации DbContext и обеспечиваете беспрепятственное совместное использование DbContext между приложениями, эффективно разрешая конфликт внедрения зависимостей.
Кроме того, если ваш проект dbContext находится в другом проекте, убедитесь, что вы добавили ссылку в свой основной проект. Поскольку ошибка указывает на то, что DI не был введен соответствующим образом.
Еще одна важная вещь — структура вашего проекта. Я не уверен, как обстоят дела. Но я попробовал следующую структуру проекта, и она работает без каких-либо ошибок, и я смог извлечь значение из базы данных.
Поделюсь, как я устал:
Класс DbContext:
using DbContextTestApp.Models;
using Microsoft.EntityFrameworkCore;
namespace DbContextTestApp.Data
{
public class HomeNotificationsDbContext: DbContext
{
public HomeNotificationsDbContext(DbContextOptions<HomeNotificationsDbContext> options)
: base(options)
{
}
public DbSet<Employee> Employees { get; set; }
}
}
Класс контроллера:
using DbContextTestApp.Data;
using DbContextTestApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace DbContextTestApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly HomeNotificationsDbContext _context;
public HomeController(ILogger<HomeController> logger, HomeNotificationsDbContext context)
{
_logger = logger;
_context = context;
}
public IActionResult Index()
{
var employees = _context.Employees;
return View();
}
}
}
Примечание. Проект веб-API не имеет изменений при добавлении класса DbContext.
Программа.cs:
using DbContextTestApp.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<HomeNotificationsDbContext>(options =>
options.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddControllersWithViews();
Выход:
Примечание. Пожалуйста, обратитесь к этому официальному документу , чтобы узнать подробности конфигурации.
Здравствуйте, извините за поздний ответ. Я ценю вашу помощь и прошу прощения за то, что не предоставил достаточно информации, чтобы лучше объяснить мою проблему. Я решил свою проблему, не зарегистрировав DbContext в обоих файлах Program.cs, а зарегистрировав службы только в файле Web Program.cs и не выполняя регистрацию в веб-API.
Хорошо, спасибо за ваш ответ, рад узнать, что вы смогли решить проблему.
Ваш DbContext и основное веб-приложение находятся в одном проекте или находятся в разных библиотеках классов? Не могли бы вы также поделиться структурой вашего проекта?