Как настроить Dependency Injection в моем собственном классе - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу использовать настройки из appsettings.json в моем собственном классе.

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

public class Email
{
    private readonly IConfiguration _config;

    public Email(IConfiguration config)
    {
        _config = config;
    }

, но когда я пытаюсь вызвать это

Email sendEmail = new Email();

, требуется, чтобы я предоставил config в качестве параметра,Разве система DI не должна обеспечивать (вводить) это?В ConfigureServices у меня есть это:

services.AddSingleton(Configuration);

Нужно ли мне тоже где-то регистрировать класс электронной почты?Нужно ли называть это по-другому?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Как вы упомянули, вы определили конструктор, который требует параметр.

Пожалуйста, ознакомьтесь с концепцией Конструкторы классов .

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

0 голосов
/ 12 сентября 2018

При использовании следующего кода:

Email sendEmail = new Email();

Система DI вообще не задействована - вы взяли вещи в свои руки. Вместо этого вы должны добавить Email в систему DI и затем ввести it . e.g.:

services.AddSingleton<Email>(); // You might prefer AddScoped, here, for example.

Тогда, например, если вы обращаетесь к Email в контроллере, вы также можете ввести его:

public class SomeController : Controller
{
    private readonly Email _email;

    public SomeController(Email email)
    {
        _email = email;
    }

    public IActionResult SomeAction()
    {
         // Use _email here.
         ...
    }
}

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


Это немного отчасти, но вы также можете вводить зависимости, используя атрибут [FromServices] внутри действия. Используя это означает, что вы можете пропустить подход конструктора и частного поля. e.g.:

public class SomeController : Controller
{
    public IActionResult SomeAction([FromServices] Email email)
    {
         // Use email here.
         ...
    }
}
...