Не могу создать службу на. net core 3 с логическим значением - PullRequest
0 голосов
/ 10 января 2020

У меня есть этот класс:

public class ApiService
    {
        public bool Success { get; set; }
        public object Data { get; set; }
        public ApiService(bool success, object data)
        {
            this.Success = success;
            this.Data = data;
        }
    }

Я пытаюсь добавить его в службу в файле startup.cs с помощью следующей строки:

 services.AddSingleton<ApiService>();

Но у меня есть это исключение:

Unhandled exception. System.AggregateException: 
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: ApiService Lifetime: Singleton ImplementationType: 
ApiService': 
Unable to resolve service for type 'System.Boolean' while attempting to activate ApiService'.)

Заранее благодарен, если кто-то может решить эту проблему.

С уважением.

Ответы [ 3 ]

0 голосов
/ 10 января 2020

Это может работать, только если аргументы в конструкторе оба являются интерфейсами и зарегистрированы в конвейере DI. Если вы хотите использовать конкретные типы, подобные этому, вы должны указать значения при регистрации

services.AddSingleton<ApiService>(new ApiService(false,data));

Он не знает, какие значения вы хотите поместить в этот конструктор. Другой вариант - предоставить конструктор по умолчанию, который не имеет аргументов.

Но на самом деле вам не нужно регистрировать этот класс с помощью Dependency Injection, потому что у этого класса нет никаких зависимостей, которые нужно внедрять в первую очередь. Если вы действительно хотите, чтобы в приложении использовался только один экземпляр, сделайте его c. Синглтоны - это анти-паттерн.

0 голосов
/ 10 января 2020

Это происходит потому, что ваш конструктор класса требует 2 параметра. Ошибка говорит о том, что механизм инжектора зависимостей пытался создать экземпляр вашего класса, но не смог, потому что вы не передаете эти 2 параметра bool success, object data. Вы можете зарегистрировать свою зависимость, используя services.AddSingleton<ApiService>(new ApiService(true,null));

Но я настоятельно отговаривать вас создавать такой сервис. Взгляните сюда Внедрение зависимостей .

Создайте интерфейс для вашего сервиса и удалите эти параметры конструктора. Таким образом, вы сможете зарегистрировать свой сервис следующим образом: services.AddSingleton<IApiService, ApiService>();, с помощью которого вы сможете внедрить свой IApiService в любое место вашего приложения, просто передав его в свой конструктор.

public class MyOtherClass 
{
      private readonly IApiService  _myService;
      public MyOtherClass(IApiService myService) 
      {
            _myService = myService;
      }
}
0 голосов
/ 10 января 2020

попробуй:

services.AddSingleton<ApiService>(new ApiService(true,null));
...