. Net Базовая служба не регистрируется - PullRequest
1 голос
/ 06 марта 2020

У меня есть следующие два класса с интерфейсом

public interface IInterface1
{
 //declarations
}

public class class1 : IInterface1
{
 //definitions
}

public interface IInterface2
{
//declarations
}

public class class2 : IInterface2
{
   private readonly IInterface1 _interface;
   //constructor
   public class2(IInterface1 interface1)
   {
     //getting null for interface1
     _interface = interface1;
   }
}

и контроллером, в который я вводю IInterface2

public class MyController : Controller
{
  private readonly IInterface2 _usecase;
  public MyController(IInterface2 usecase)
  {
    _usecase = usecase;
  }
}

и в Startup.cs я зарегистрировал службу, подобную этой

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IInterface2, class2>();
  services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>());
}

проблема, с которой я сталкиваюсь, когда я IInterface1 в class2 не могу получить доступ к свойствам интерфейса1 в конструкторе вместо того, чтобы получить ноль

1 Ответ

2 голосов
/ 06 марта 2020

Пример, который вы показали в вопросе, работает хорошо, если вы замените конфигурацию следующим образом:

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IInterface2, class2>();
  services.AddScoped<IInterface1, class1>();
}

Обратите внимание, что строка, которую вы написали:

services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>())

вызывает Access Violation

(потому что, когда требуется Interface1, система зависимостей попытается получить ... 1011 * из системы зависимостей, используя GetService, выполняя это правило в бесконечной рекурсии)

Нам нужны дополнительные сведения, чтобы понять вашу проблему и помочь решить ее.

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

...