如何在我自己的班级中配置依赖注入

时间:2018-09-12 11:54:57

标签: c# asp.net-core .net-core asp.net-core-mvc .net-core-2.1

我希望在自己的类中使用来自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 :(得分:0)

使用以下代码时:

Email sendEmail = new Email();

根本不涉及DI系统-您已经掌握了一切。相反,您应该将Email添加到DI系统,然后注入 it 。例如:

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。如果您想提供有关 where 的更多详细信息,而您当前正在创建Email类,那么我可以为这些示例进一步定制。


这有点麻烦,但是您也可以使用动作内部的[FromServices]属性来注入依赖项。使用此方法意味着您可以跳过构造函数和私有字段方法。例如:

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

答案 1 :(得分:0)

如前所述,您定义了一个需要该参数的构造函数。

请查看Class Constructors的概念。

注入是设计模式,当我们使用类和接口来实现它时,它仍应遵循基本的类方法和概念。 希望对您有所帮助。