Неуниверсальный метод IServiceProvider.GetService (Type) не может использоваться с аргументами типа - PullRequest
0 голосов
/ 16 января 2019

Я использую инъекцию зависимостей .NET Core, но когда я пытаюсь получить службу в другом классе, я получаю сообщение «IServiceProvider.GetService (Type)» не может быть использовано с аргументами типа «ошибка».

Что означает эта ошибка? Я понимаю, что аргумент универсального типа выглядит примерно так: GenericInterface <>, а метод GetService не принимает GenericInterface <> в качестве аргумента.

Почему я получаю эту ошибку и как ее решить?

Интерфейс

public interface IService
{
   void Process();
}

Класс, реализующий интерфейс

public class Service : BaseService<IConfig, SomType>
{
    public Service(
        ILogger logger : base(logger)
    {
    }

    ...
}

Класс BaseService является абстрактным классом и реализует интерфейс IService.

public abstract class BaseService<TConfig, TE> : AnotherBaseService, IService where TConfig : IConfig where TE : struct, IConvertible
{
      protected BaseService(ILogger logger): base(logger)
      {
      } 

      ...
}

AnotherBaseService

public abstract class BaseService
{
   protected readonly ILogger Logger;

   protected BaseService(ILogger logger)
   {
      Logger = logger;
   }

   ...
}

Как я их зарегистрировал.

serviceCollection.AddScoped<IService, Service>();

Как я получаю нужную мне услугу.

var incoming = serviceProvider.GetService<IService>();

NB. Я только начинаю внедрять зависимости, .NET Core и пока не знаю всего о DI. Ваши ответы будут очень полезны.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Общий GetService метод является методом расширения. Это означает, что вам нужно иметь:

using Microsoft.Extensions.DependencyInjection;

чтобы компилятор мог его найти.

Этот метод предназначен только для необязательных услуг. Он вернет null, если объект не может быть построен, либо потому, что тип не был зарегистрирован, либо потому что некоторые его зависимости отсутствуют.

GetRequiredService следует использовать, когда приложение не может работать, если служба недоступна. Если экземпляр не может быть создан, он выдаст исключение InvalidOperationException.

Когда выдается это исключение, полный текст исключения будет огромным помощью в поиске реальной проблемы. Исключения, сгенерированные в конструкторах, могут появляться в свойстве Exception.InnerException . Последовательность вызовов, завершившихся сгенерированным исключением, появится в свойстве StackTrace . Вызов Exception.ToString () вернет строку, содержащую все этой информации для текущего исключения и любых внутренних исключений.

0 голосов
/ 16 января 2019

Это означает, что ваш компилятор знает только метод, который принимает тип.

Вы можете позвонить

var incoming = serviceProvider.GetService(typeof(IService));

или вы можете добавить

using Microsoft.Extensions.DependencyInjection;

чтобы убедиться, что ваш компилятор знает метод расширения, который позволяет вам указывать ваш тип в качестве универсального параметра. Для этого может потребоваться установка пакета Microsoft.Extensions.DependencyInjection.Abstractions.

...