Asp.net Core 获取依赖注入实例

Boj*_*jan 1 c# dependencies dependency-injection asp.net-core-mvc asp.net-core

我在 Startup.cs 中添加一个全局错误处理程序过滤器,如下所示:

services.AddMvc(o =>
{
    o.Filters.Add(new GlobalExceptionFilter());
});
Run Code Online (Sandbox Code Playgroud)

但是,我需要传递我的电子邮件服务,该服务也被注入。如何从过滤器中的这些服务中检索它?

public class GlobalExceptionFilter : IExceptionFilter
{
    private readonly IEmailService _emailService;

    public GlobalExceptionFilter()
    {
    }

    public void OnException(ExceptionContext context)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我曾经能够使用 DependencyResolver 类在 MVC5 中执行此操作。有没有办法在核心中实现这一点?或者有没有办法让我在启动中强制实例化服务,以便我可以将其作为构造函数的一部分传递?

我尝试在服务中查找它,然后查看ImplementationInstance,但此时它为空,所以我无法从它出现的地方获取它。另请记住,我的 EmailService 需要一个参数,IOptions<Settings>以便它可以获取所需的电子邮件设置。

Shy*_*yju 6

您可以使用构造函数注入。

public class GlobalExceptionFilter : IExceptionFilter
{
    private readonly IEmailService emailService;
    public GlobalExceptionFilter(IEmailService emailService)
    {
        this.emailService = emailService;
    }
    public void OnException(ExceptionContext context)
    {
       //do something with this.emailService
    }
}
Run Code Online (Sandbox Code Playgroud)

但是您必须更改在方法中注册全局过滤器的方式ConfigureServices。您应该使用Add采用 Type 的重载

services.AddMvc(o =>
{
    o.Filters.Add(typeof(GlobalExceptionFilter));
});
Run Code Online (Sandbox Code Playgroud)

OnException另一种选择是,通过调用GetService上的方法来显式解决方法内部的依赖关系HttpContext.RequestServices

using Microsoft.Extensions.DependencyInjection;

public void OnException(ExceptionContext context)
{
    var emailService = context.HttpContext.RequestServices.GetService<IEmailService>();
    // use emailService
} 
Run Code Online (Sandbox Code Playgroud)

但你应该可以接受第一种方法。让框架为您解决它并注入到您的构造函数中,而不是您尝试这样做。