我正在尝试了解 ASP.NET MVC CORE 中的依赖注入(inject)。
所有的例子都是一样的,都是注册HttpContextAccessor
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
然后是想要访问它的类:
public class UserService : IUserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public bool IsUserLoggedIn()
{
var context = _httpContextAccessor.HttpContext;
return context.User.Identities.Any(x => x.IsAuthenticated);
}
}
但是,当我真正想要创建一个 UserService 实例时,它会在构造函数中请求 httpContextAccessor 对象,我从哪里得到它?
最佳答案
当使用依赖注入(inject)时,您实际上不应该自己创建任何服务。要使用您的 UserService
,您也应该将其注入(inject)某处。
通常,ASP.NET Core 中的应用程序代码流从 Controller 开始。所以如果你想在 Controller 操作中使用 UserService
,你应该将它注入(inject) Controller :
public class ExampleController : Controller
{
private readonly IUserService _userService;
public ExampleController(IUserService userService)
{
_userService = userService;
}
public IActionResult Index()
{
var isLoggedIn = _userService.IsUserLoggedIn();
// …
return View();
}
}
因此您不会使用 new
自己创建实例,而是依赖依赖注入(inject)系统为您提供实例。
您只需要确保在 ConfigureServices
中注册该服务:
services.AddTransient<IUserService, UserService>();
无论您在应用程序中的哪个位置,此原则都适用。由于入口点始终由系统创建,您始终处于依赖注入(inject)上下文中,因此您可以只依赖于本身具有依赖性的事物(它们又可能具有更多依赖性等)。
我强烈建议您阅读 chapter on dependency injection的文档,因为它很好地涵盖了这个想法。它还解释了不同生命周期的含义。
关于c# - asp.net mvc 核心依赖注入(inject)构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743378/