MVC 6 IUrlHelper 依赖注入
MVC 6 IUrlHelper Dependency Injection
我想通过依赖项注入使用 IUrlHelper,以便能够使用其功能为不同的 rest 端点生成 uris。我似乎无法弄清楚如何从头开始创建 UrlHelper,因为它在 MVC 6 中发生了变化,并且 MVC 不会自动在 IoC 控制器中提供该服务。
设置是我的控制器采用内部模型到 api 模型转换器 class 并使用 IUrlHelper(全部通过依赖注入)。
如果有比 IUrlHelper/UrlHelper 更好的替代方法,我可以用来为我的 WebApi 生成 Uris action/controllers 我愿意接受建议。
此方法现已过时。看下面的更新。
您可以注入 IHttpContextAccessor 并从那里获取服务,而不是 services.AddTransient<IUrlHelper, UrlHelper>()
或尝试直接注入 IUrlHelper。
public ClassConstructor(IHttpContextAccessor contextAccessor)
{
this.urlHelper = contextAccessor.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
}
除非是bug,否则用UrlHelper 添加IUrlHelper 服务是行不通的。
更新 2017-08-28
之前的方法好像不行了。
下面是一个新的解决方案。
将 IActionContextAccessor 配置为服务:
public void ConfigureServices(IServiceCollection services)
{
services
.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
.AddMvc();
}
然后注入 IActionContextAccessor 和 IUrlHelperFactory 生成如下所示的 IUrlHelper
public class MainController : Controller
{
private IUrlHelperFactory urlHelperFactory { get; }
private IActionContextAccessor accessor { get; }
public MainController(IUrlHelperFactory urlHelper, IActionContextAccessor accessor)
{
this.urlHelperFactory = urlHelper;
this.accessor = accessor;
}
[HttpGet]
public IActionResult Index()
{
ActionContext context = this.accessor.ActionContext;
IUrlHelper urlHelper = this.urlHelperFactory.GetUrlHelper(context);
//Use urlHelper here
return this.Ok();
}
}
UrlHelper 需要当前的操作上下文,我们可以从 ActionContextAccessor 获取它。我正在使用这个:
services.AddScoped<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetService<IActionContextAccessor>().ActionContext;
return new UrlHelper(actionContext);
});
现在,您可以将 IUrlHelper 直接注入到任何需要它的地方,而无需跳过 IHttpContextAccessor 。
ASP.NET核心2.0
安装
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper
使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddUrlHelper();
...
}
免责声明:此包的作者
适用于 .NET 核心 3.1
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
.AddScoped(x =>
x.GetRequiredService<IUrlHelperFactory>()
.GetUrlHelper(x.GetRequiredService<IActionContextAccessor>().ActionContext)); //Inject UrlHelp for
我想通过依赖项注入使用 IUrlHelper,以便能够使用其功能为不同的 rest 端点生成 uris。我似乎无法弄清楚如何从头开始创建 UrlHelper,因为它在 MVC 6 中发生了变化,并且 MVC 不会自动在 IoC 控制器中提供该服务。
设置是我的控制器采用内部模型到 api 模型转换器 class 并使用 IUrlHelper(全部通过依赖注入)。
如果有比 IUrlHelper/UrlHelper 更好的替代方法,我可以用来为我的 WebApi 生成 Uris action/controllers 我愿意接受建议。
此方法现已过时。看下面的更新。
您可以注入 IHttpContextAccessor 并从那里获取服务,而不是 services.AddTransient<IUrlHelper, UrlHelper>()
或尝试直接注入 IUrlHelper。
public ClassConstructor(IHttpContextAccessor contextAccessor)
{
this.urlHelper = contextAccessor.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
}
除非是bug,否则用UrlHelper 添加IUrlHelper 服务是行不通的。
更新 2017-08-28
之前的方法好像不行了。 下面是一个新的解决方案。
将 IActionContextAccessor 配置为服务:
public void ConfigureServices(IServiceCollection services)
{
services
.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
.AddMvc();
}
然后注入 IActionContextAccessor 和 IUrlHelperFactory 生成如下所示的 IUrlHelper
public class MainController : Controller
{
private IUrlHelperFactory urlHelperFactory { get; }
private IActionContextAccessor accessor { get; }
public MainController(IUrlHelperFactory urlHelper, IActionContextAccessor accessor)
{
this.urlHelperFactory = urlHelper;
this.accessor = accessor;
}
[HttpGet]
public IActionResult Index()
{
ActionContext context = this.accessor.ActionContext;
IUrlHelper urlHelper = this.urlHelperFactory.GetUrlHelper(context);
//Use urlHelper here
return this.Ok();
}
}
UrlHelper 需要当前的操作上下文,我们可以从 ActionContextAccessor 获取它。我正在使用这个:
services.AddScoped<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetService<IActionContextAccessor>().ActionContext;
return new UrlHelper(actionContext);
});
现在,您可以将 IUrlHelper 直接注入到任何需要它的地方,而无需跳过 IHttpContextAccessor 。
ASP.NET核心2.0
安装
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper
使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddUrlHelper();
...
}
免责声明:此包的作者
适用于 .NET 核心 3.1
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
.AddScoped(x =>
x.GetRequiredService<IUrlHelperFactory>()
.GetUrlHelper(x.GetRequiredService<IActionContextAccessor>().ActionContext)); //Inject UrlHelp for