ASP.NET Core抽象类依赖注入问题:自定义Razor视图页获取当前用户
在自定义WebViewPage中获取依赖注入服务的方法
在ASP.NET Core 2里,要给你自定义的WebViewPage抽象类注入IUserService其实很简单,这里有两种实用的实现方式:
方式一:直接从请求上下文获取(简单便捷)
你可以利用基类自带的PageContext属性,访问当前请求的服务容器来获取IUserService。为了避免重复调用服务,还可以加个缓存字段:
public abstract class WebViewPage<TModel> : Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel> { public string Version { get { return "1.00.100"; } } private User _currentUser; public User CurrentUser { get { if (_currentUser == null) { // 从请求上下文的服务容器中获取IUserService实例 var userService = PageContext.RequestServices.GetRequiredService<IUserService>(); _currentUser = userService.GetCurrentUser(); } return _currentUser; } } } public abstract class WebViewPage : WebViewPage<dynamic> { }
方式二:构造函数注入(符合DI最佳实践)
如果更倾向于标准的依赖注入模式,可以给自定义基类添加构造函数来接收IUserService,记得给无泛型版本的类也添对应构造函数:
public abstract class WebViewPage<TModel> : Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel> { private readonly IUserService _userService; private User _currentUser; public string Version { get { return "1.00.100"; } } // 通过构造函数注入IUserService public WebViewPage(IUserService userService) { _userService = userService; } public User CurrentUser { get { if (_currentUser == null) { _currentUser = _userService.GetCurrentUser(); } return _currentUser; } } } public abstract class WebViewPage : WebViewPage<dynamic> { // 传递服务实例给基类构造函数 public WebViewPage(IUserService userService) : base(userService) { } }
关键注意点
- 一定要在
Startup.cs的ConfigureServices里正确注册IUserService,比如:services.AddScoped<IUserService, UserService>(),否则获取服务时会抛出异常。 - 缓存
_currentUser是合理的,因为每个请求的WebViewPage实例是Scoped生命周期,一次请求内用户信息不会改变。
内容的提问来源于stack exchange,提问作者Saleh Bagheri
相关产品推荐
相关产品推荐

