Почему запрос возращает 500 код состояния?

Помогите разобраться, есть следующий код конроллера на ASP.NET Core

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
  private readonly IRoyalityService _royalityService;

  public RtbController(IRoyalityService royalityService)
        {
           _royalityService = royalityService;
        }

        [HttpGet]
        public async Task<IActionResult> Action()
        {
          //Код контроллера
        }

Служба royalityService зарегестрированна в классе Startup следующим образом:

services.AddSingleton<IRoyalityService, RoyalityService>();

Вот код самого интерфейса и класса, который его реализует:

public interface IRoyalityService
{
   string CostEncode(decimal value, bool exclude_initialization_vector);
}

public class RoyalityService : IRoyalityService
{
   string _encoder;

   public RoyalityService(byte[] encryption_key, byte[] integrity_key)
   {
      _encoder = // Некий код
   }

   public string CostEncode(decimal value, bool exclude_initialization_vector)
   {
     return // Некий код
   }
}

При обращении к данному контроллеру http://localhost:5000/api/Test запрос возращает 500 ошибку но если убрать из контролера службу IRoyalityService royalityService, то ошибки не будет (НО служба нужна), кто нибудь знает, почему может появляться данная ошибка?


Ответы (1 шт):

Автор решения: Viktor

В классе RoyalityService объявлен конструктор с 2-мя параметрами. Поэтому Di-контейнер просто не может создать его. Вам надо либо:

  1. Добавить конструктор по умолчанию, без параметров;
  2. Добавить конструктор, который будет загружать сервис для работы с вашими параметрами.

Всё зависит от того где у вас хранятся параметры encryption_key и integrity_key.

Например, как-то так:

public class RoyalitySettings
{
   public byte[] Encryption_key { get; set; }
   
   public byte[] Integrity_key { get; set; }
}

public interface IRoyalitySettingsService
{
   RoyalitySettings LoadSettings();
}

public class RoyalityService : IRoyalityService
{
   string _encoder;

   public RoyalityService(IRoyalitySettingsService settingsService)
   {
      _encoder = // Некий код
   }

   public string CostEncode(decimal value, bool exclude_initialization_vector)
   {
     return // Некий код
   }
}

Сервис по работе с настройками также надо будет зарегистрировать в контейнере:

services.AddSingleton<IRoyalitySettingsService, RoyalitySettingsService>();

Более подробно про внедрение зависимостей можно почитать здесь: https://docs.microsoft.com/en-us/dotnet/core/extensions/dependency-injection

→ Ссылка