Как внедрить синглтон в конструктор пользовательских классов и использовать его | .NET Core 2 - PullRequest
0 голосов
/ 16 января 2019

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

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

Connector.cs
public class Connector
{
    private IConfiguration _configuration;
    public Connector(IConfiguration configuration) {
       _configuration = configuration;
    }

    public Connector() {
    } 

    public string DoSomething() {
      //return Something related to _configuration
    }
}

startup.cs
public void ConfigureServices(IServiceCollection services)
{    
    //Other default config

     services.AddSingleton(new Connector(Configuration));
 }

 HomeController.cs
 public IActionResult Index()
 {

        var x = (new Connector()).DoSomething(); //This will fail as _configuration is not injected
        return View();
 }

Как я могу вызвать Соединитель с введенной Конфигурацией? Мне не хватает разрешения зависимостей? Я неправильно звоню в класс?

Я надеюсь, что кто-нибудь может пролить на меня немного света.

1 Ответ

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

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

Вы просто внедряете зависимость в свой конструктор.
Поскольку вы настроили его как одноэлементный, контейнер DI будет разрешать Connector в один и тот же экземпляр каждый раз.

public class HomeController 
{ 
    private readonly Connector _connector;

    public HomeController(Connector connector)
    {
        _connector = connector;
    }

    public IActionResult Index()
    {
        var x = _connector.DoSomething();
        // ...
    }
...