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。
您可以将其添加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,但这将是更紧密的耦合。)
| 归档时间: |
|
| 查看次数: |
3783 次 |
| 最近记录: |