Параметры DI для библиотеки классов без контроллера

Некоторые операторы в JavaScript выполняют неявные преобразования типов и иногда используются для преобразования типов.

Унарный оператор ! преобразует свой операнд в булев и отрицает его.

Этот факт приводит к следующей идиоме, которую вы можете увидеть в своем исходном коде:

!!x // Same as Boolean(x). Note double exclamation mark
0
задан dave k 22 January 2019 в 20:18
поделиться

1 ответ

Несколько вещей:

  • В вашем методе MakeItWork() есть код, который «вызывает» метод с использованием имени интерфейса - даже не уверен, как он будет компилироваться. Вам нужно использовать объект класса, который реализует этот интерфейс, чтобы фактически делать вызовы методов во время выполнения. Например, в вашем классе DoWork у вас может быть конструктор, запрашивающий экземпляр класса, который реализует интерфейс IEmailService и сохраняет его для будущего использования в других методах.

  • Во-вторых, в коллекцию Services вы добавляете зависимость «Scoped» (в методе ConfigureServices). Зависимость "scoped" создается только по запросу (http), обычно через вызовы контроллеров. Исходя из вашего кода и вашего объяснения, похоже, что вы хотите добавить объект Singleton для вашего интерфейса IEmailService. Таким образом, вместо добавления зависимости Scoped используйте AddSingleton - как вы уже сделали, вы также можете создать конкретный объект в вызове AddSingleton - это означает, что этот объект будет предоставляться каждый раз, когда вы его запрашиваете (через конструкторы классов например). Если вы используете его как синглтон, вы также должны убедиться, что он является потокобезопасным. Кроме того, вы также можете добавить зависимость, используя AddTransient - если вы используете это, новый объект будет создаваться каждый раз, когда вы запрашиваете его.

Обновление: Пример кода

Измените ваши ConfigureServices, чтобы сделать EmailService как переходный (это означает новый объект каждый раз, когда запрашивается эта служба) :

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
   services.AddTransient<IEmailService, EmailService>();
   ...
}

Ваш класс «DoWork» должен запросить службу EMail в конструкторе:

public class DoWork()
{

private IEmailService _emailService;

//Dependency should be injected here
public DoWork(IEmailService emailService)
{
    _emailService = emailService;
}


public MakeItWork()
{
   try
   {...}
   catch (exception ex)
   {
      //Use the saved email service object to do your work
      _emailService.SendErrorEmail("BAL - MakeItWork", ex)
   }
}

}

Это не заканчивается здесь. Остается вопрос, как вы собираетесь создать объект класса DoWork. Для этого одной из идей является создание интерфейса для самого класса DoWork, а затем настройка контейнера для этого интерфейса. Затем, где бы вы ни захотели использовать реализацию DoWork, вы можете «запросить» интерфейс для DoWork. Или используйте контейнер непосредственно для создания экземпляра.

0
ответ дан Phantom2018 22 January 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: