需要在Startup.cs的ConfigureServices方法中获取站点URL

Fio*_*ite 5 c# dependency-injection asp.net-core

我使用的是 ASP.NET Core MVC 2.2,我需要在 Startup.cs 的 ConfigureServices 方法中获取网站的当前 URL。

这是因为 URL 被传递到我在该方法中配置的库的构造函数中。

services.AddScoped<IEmailProvider>(ep => new SendGridEmailProvider(Configuration["Email:SendGridApiKey"],
                Configuration.GetValue<bool>("Email:TestMode", true), 
                Configuration["Email:TestModeEmailAddresses"],
                Configuration["ENVIRONMENT"], 
                "THIS SHOULD BE THE APPLICATION URL"));
Run Code Online (Sandbox Code Playgroud)

我非常确定我无法在ConfigureServices 中使用标准依赖项注入技术,因为这是所有依赖项注入实际设置的地方!

有没有办法获取请求的当前 URL?我只需要基本 URL,例如 www.site.com。

crg*_*den 1

您可以将其添加HttpContext到 DI 容器中:

services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)

然后你可以开设一个课程来举办你的EmailOptions

public class EmailOptions
{
    public string ApiKey { get; set; }
    public bool TestMode { get; set; }
    public string TestModeEmail { get; set; }
    public string Environment { get; set; }
    public string Url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后添加一个类来配置您的EmailOptions

public class ConfigureEmailOptions : IConfigureOptions<EmailOptions>
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly IConfiguration _configuration;
    private readonly IHostingEnvironment _environment;

    public ConfigureEmailOptions(
        IHttpContextAccessor httpContextAccessor,
        IConfiguration configuration,
        IHostingEnvironment environment)
    {
        _httpContextAccessor = httpContextAccessor;
        _configuration = configuration;
        _environment = environment;
    }

    public void Configure(EmailOptions options)
    {
        options.ApiKey = _configuration["Email:SendGridApiKey"];
        options.TestMode = _configuration.GetValue<bool>("Email:TestMode", true);
        options.TestModeEmail = _configuration["Email:TestModeEmailAddresses"];
        options.Environment = _environment.EnvironmentName;
        options.Url = _httpContextAccessor.HttpContext.Request.Scheme + "://" + _httpContextAccessor.HttpContext.Request.Host + _httpContextAccessor.HttpContext.Request.PathBase;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将您的添加EmailOptions到 DI 容器中:

services.AddTransient<IConfigureOptions<EmailOptions>, ConfigureEmailOptions>();    
services.Configure<EmailOptions>(Configuration);
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够注入IOptions<EmailOptions>到您的SendGridEmailProvider. (您也可以IHttpContextAccessor直接注入到您的 中SendGridEmailProvider,但这将是更紧密的耦合。)

  • 配置在收到第一个请求*之前*运行。执行配置时没有请求,因此没有 HttpContext (2认同)