c# - asp.net mvc 核心依赖注入(inject)构造函数参数

标签 c# asp.net-core

我正在尝试了解 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/

相关文章:

c# - 如何在 ActiveMQ 中使用 MaxReconnectAttemps

c# - 为什么沙漏 (WaitCursor) 会停止旋转?

c# - Web API 2 的不区分大小写的路由

c# - 通过 LINQ 获取字符串列表

asp.net-core - 我可以将 asp.net core mvc 和 web api 作为单个项目吗

c# - ASP.NET Identity UserStore中GetNormalizedUserNameAsync和SetNormalizedUserNameAsync函数的解释

c# - 在 C# 中以字节为单位查找对象实例的大小

asp.net-core - 使用 ASP.NET Core 库禁用 Application Insights 采样

c# - 如何在不执行 Queryable 的情况下以通用方式替换 Queryable<T> 中的列

javascript - Signalr Core 1.0.3 - 在页面刷新时保持连接