.net 如何在项目中的任何地方访问WebRootPath?

6gpjuf90  于 2023-02-06  发布在  .NET
关注(0)|答案(2)|浏览(239)

我想在asp.net核心mvc应用程序的任何地方访问IWebHostEnvironment.WebRootPath。例如,在类层次结构深处的某个随机类。是否有静态类或其他方法可以实现这一点?
我知道我可以注入IWebHostEnvironment,或者可以在应用程序启动时缓存值,我的问题严格来说是关于不使用这些方法访问它。

lyr7nygr

lyr7nygr1#

我知道我可以注入IWebHostEnvironment,或者可以在应用程序启动时缓存值,我的问题严格来说是关于不使用这些方法访问它。
不,你不能。这里没有内置的静态访问这些信息。你可以创建自己的。

z18hc3ub

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,如下所示

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();
    }
}

相关问题