Веб-API ASP.NET Core не может найти мой DbContext

У меня есть веб-приложение 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 и основное веб-приложение находятся в одном проекте или находятся в разных библиотеках классов? Не могли бы вы также поделиться структурой вашего проекта?

Md Farid Uddin Kiron 25.03.2024 01:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался добавить 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.

Krasimir Dimitrov 03.04.2024 14:24

Хорошо, спасибо за ваш ответ, рад узнать, что вы смогли решить проблему.

Md Farid Uddin Kiron 05.04.2024 02:47

Другие вопросы по теме