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

时间:2019-09-03 08:33:16

标签: c# asp.net-core dependency-injection

我正在使用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"));

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

是否可以通过某种方式获取请求的当前URL?我只需要基本网址,如www.site.com。

1 个答案:

答案 0 :(得分:0)

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

services.AddHttpContextAccessor();

然后您可以上一堂课来举行您的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; }
}

然后添加一个类来配置您的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;
    }
}

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

services.AddTransient<IConfigureOptions<EmailOptions>, ConfigureEmailOptions>();    
services.Configure<EmailOptions>(Configuration);

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