Консольное приложение Net Core 2 - DI «Не удается разрешить службу для типа ...» - PullRequest
0 голосов
/ 22 ноября 2018

Я читал несколько постов, но, похоже, ничего не подходит для моей проблемы.

Я разрабатываю консольное приложение с .Net Core 2.1 и EF Core, пытаясь следовать советам Microsoft, но я сталкиваюсьсо следующей проблемой.

У меня есть проект с именем myproject.data , который содержит все интерфейсы и службы.Это, например,

ILeagueService.cs

public interface ILeaguesService
{
    List<Leagues> GetAllLeaguesValids();
}

LeagueService.cs

private statsContext _context;

public LeaguesService(statsContext context)
{
    _context = context;
}

public List<Leagues> GetAllLeaguesValids()
{
    return _context.Leagues.Where(x => (x.DateFirstMatch != null || x.CurrentLastSeason == true) && x.Active == true).OrderBy(x => x.Id).ToList();
}

Тогда яразделите все методы моего приложения, и все они наследуются от одного класса.В этом классе Base.cs я настраиваю ServiceProvider

Base.cs

public ServiceProvider _serviceProvider;

public Base()
{
    ConfigureServices();

    _config = new HelperConfig(CONFIG_FILE);
    _html = GetHelperHtml();
    _context = GetContext();
}

private void ConfigureServices()
{
    _serviceProvider = new ServiceCollection()
        .AddScoped<ILeaguesService, LeaguesService>()
        .BuildServiceProvider();
}

Когда я пытаюсь использовать LeagueService в одном изметоды, которые я получаю, «Невозможно разрешить службу для типа myproject.stats.statsContext», ошибка

GetNextMatches.cs

private ILeaguesService _leagueService;

public GetNextMatches()
{
   _config.GetSection(AppsettingsModel.BetExplorerUrlsSection).Bind(betExplorerSectionKeys);

    _leagueService = _serviceProvider.GetService<ILeaguesService>(); <-- In this line I get the error
}

1 Ответ

0 голосов
/ 23 ноября 2018

При использовании ServiceProvider DI необходимо зарегистрировать все классы в иерархии.Контейнер DI пытается создать ваш класс LeagueService, но для вызова его конструктора ему необходимо создать экземпляр statsContext.Однако он не может найти это в своем реестре, поэтому выдает исключение.

Решение состоит в том, чтобы добавить statsContext в вашу коллекцию служб.

private void ConfigureServices()
{
    _serviceProvider = new ServiceCollection()
        .AddScoped<ILeaguesService, LeaguesService>()
        .AddScoped<statsContext>()
        .BuildServiceProvider();
}

Я собираюсь предположить, что вы _context переменная - это statsContext, которую вы хотите внедрить, чтобы вы могли использовать свой метод GetContext() для создания контекста для вас:

private void ConfigureServices()
{
    _serviceProvider = new ServiceCollection()
        .AddScoped<ILeaguesService, LeaguesService>()
        .AddSingleton<statsContext>(GetContext())
        .BuildServiceProvider();
}

Это вызовет ваш GetContext() один раз, чтобы создать ваш единственный экземплярstatsContext.Теперь всякий раз, когда вы вызываете

_leagueService = _serviceProvider.GetService<ILeaguesService>();

, DI будет внедрять синглтонный экземпляр statsContext при создании класса LeageService.

...