Внедрить один сервис, который использует методы из нескольких интерфейсов - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь внедрить экземпляр службы в мой NameController. Служба использует методы из нескольких классов обслуживания, поэтому я делаю это с множественным наследованием интерфейса.

С предоставленным мною кодом, используя _oneThreeService, я действительно могу получить доступ ко всем методам, которые OneService.cs и TwoService.cs содержат. Однако, когда я запускаю приложение, я получаю сообщение об ошибке: InvalidOperationException: Unable to resolve service for type 'ServiceClassLibrary.IOneThreeService' while attempting to activate 'Web.Controllers.NameController'.

В методе ConfigureServices я попытался добавить эту строку services.AddScoped<IOneThreeService, OneService, ThreeService>();, но это невозможно сделать.

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

Startup.cs> Метод ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
      services.AddScoped<IOneService, OneService>();
      services.AddScoped<ITwoService, TwoService>();
      services.AddScoped<IThreeService, ThreeService>();

      services.AddControllersWithViews();
}

IOneThreeService. cs:

public interface IOneThreeService : IOneService, IThreeService
{

}

NameController.cs:

public class NameController : Controller
{
    private readonly IOneThreeService _oneThreeService;

    public NameController(IOneThreeService oneThreeService)
    {
        _oneThreeService = oneThreeService;
    }

    [HttpGet]
    public IActionResult Index()
    {
        _oneThreeService.MethodFromOneService();
        _oneThreeService.MethodFromTwoService();

        return View();
    }
}

1 Ответ

1 голос
/ 23 января 2020

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

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

Новый интерфейс также должен быть зарегистрирован - нет волшебников c, чтобы найти реализацию такого интерфейса.

Опции:

  • класс записи, который реализует IOneThreeService полностью и зарегистрируйте его.
  • класс записи, который принимает реализации IOneService и IThreeService, затем реализует IOneThreeService, перенаправляя вызовы в соответствующую службу и регистрируя ее (если конструктор просто принимает интерфейс контейнера DI заполнит их на соответствующих зарегистрированных базовых интерфейсах).
  • вместо создания нового интерфейса вы можете просто реализовать оба интерфейса в одном классе и зарегистрировать один и тот же экземпляр для обоих интерфейсов
...