我正在尝试理解ASP.NET MVC CORE中的依赖注入.
所有的例子都是一样的,他们表示注册 HttpContextAccessor
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
Run Code Online (Sandbox Code Playgroud)
然后是想要访问它的类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我真的想要创建一个UserService实例时,它会在构造函数中请求httpContextAccessor对象,我从哪里得到它?
使用依赖注入时,您不应该自己创建任何服务.为了消耗你UserService,你应该只注入它.
通常,ASP.NET Core中用于应用程序代码的流程在控制器中启动.因此,如果要使用UserService控制器操作的内部,则应将其注入控制器:
public class ExampleController : Controller
{
private readonly IUserService _userService;
public ExampleController(IUserService userService)
{
_userService = userService;
}
public IActionResult Index()
{
var isLoggedIn = _userService.IsUserLoggedIn();
// …
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您不要自己创建实例new,而是依靠依赖注入系统为您提供实例.
您只需要确保在以下内容中注册服务ConfigureServices:
services.AddTransient<IUserService, UserService>();
Run Code Online (Sandbox Code Playgroud)
无论您在申请中的哪个位置,此原则都适用.由于入口点始终由系统创建,因此您总是在依赖注入上下文中,因此您可以依赖于具有依赖项的事物(这可能具有更多依赖性等).
我强烈建议你阅读关于文档依赖注入的章节,因为它很好地涵盖了这个想法.它还解释了不同的生命周期意味着什么.