我想在asp.net核心mvc应用程序的任何地方访问IWebHostEnvironment.WebRootPath。例如,在类层次结构深处的某个随机类。是否有静态类或其他方法可以实现这一点?我知道我可以注入IWebHostEnvironment,或者可以在应用程序启动时缓存值,我的问题严格来说是关于不使用这些方法访问它。
lyr7nygr1#
我知道我可以注入IWebHostEnvironment,或者可以在应用程序启动时缓存值,我的问题严格来说是关于不使用这些方法访问它。不,你不能。这里没有内置的静态访问这些信息。你可以创建自己的。
z18hc3ub2#
您可以通过执行以下操作来实现此目的在Web项目引用的共享项目或公共项目中添加以下接口
public interface IApplicationContext { public string BaseUrl { get; } }
然后,在Web项目中添加以下代码
public sealed class ApplicationContext : IApplicationContext { private readonly IWebHostEnvironment _webHostEnvironment; private readonly IHttpContextAccessor _httpContextAccessor; public ApplicationContext(IWebHostEnvironment webHostEnvironment, IHttpContextAccessor httpContextAccessor) { _webHostEnvironment = webHostEnvironment; _httpContextAccessor = httpContextAccessor; } public string BaseUrl { get { var baseUrl = _webHostEnvironment.IsDevelopment() ? AppConstants.BaseUrl.FELocalHostBaseUrl : _httpContextAccessor.HttpContext?.Request.BaseUrl(); return baseUrl!; } } }
然后,您需要在Startup.cs中或您配置DI的任何位置配置依赖项注入,如下所示
services.AddHttpContextAccessor(); services.AddScoped<IApplicationContext, ApplicationContext>();
然后,您可以将IApplicationContext注入到任何服务类构造函数中,并访问baseUrl,如下所示
IApplicationContext
baseUrl
public sealed class SecurityService { private readonly IApplicationContext _applicationContext; public SecurityService(IApplicationContext applicationContext) { _applicationContext = applicationContext; } public async Task<ResponseResult> SendResetPasswordEmail(ForgotPasswordModel forgotPasswordModel, CancellationToken cancellationToken) { var baseUrl = _applicationContext.BaseUrl; return new ResponseResult(); } }
2条答案
按热度按时间lyr7nygr1#
我知道我可以注入IWebHostEnvironment,或者可以在应用程序启动时缓存值,我的问题严格来说是关于不使用这些方法访问它。
不,你不能。这里没有内置的静态访问这些信息。你可以创建自己的。
z18hc3ub2#
您可以通过执行以下操作来实现此目的
在Web项目引用的共享项目或公共项目中添加以下接口
然后,在Web项目中添加以下代码
然后,您需要在Startup.cs中或您配置DI的任何位置配置依赖项注入,如下所示
然后,您可以将
IApplicationContext
注入到任何服务类构造函数中,并访问baseUrl
,如下所示