繁体   English   中英

asp.net mvc核心依赖注入构造函数参数

[英]asp.net mvc core dependency injection constructor parameter

我正在尝试理解ASP.NET MVC CORE中的依赖注入。

所有示例都相同,它们显示为注册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对象,我从哪里得到它?

使用依赖注入时,您不应该自己创建任何服务。 要使用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();
    }
}

因此,您不使用new自己创建实例,而是依靠依赖注入系统为您提供实例。

您只需要确保在ConfigureServices注册服务:

services.AddTransient<IUserService, UserService>();

无论您在申请中的哪个位置,此原则都适用。 由于入口点始终由系统创建,因此您总是在依赖注入上下文中,因此您可以依赖于具有依赖项的事物(这可能具有更多依赖性等)。

我强烈建议你阅读关于文档依赖注入章节 ,因为它很好地涵盖了这个想法。 它还解释了不同的生命周期意味着什么。

在DI中,您通常不需要自己创建实例。 相反,您需要将实现的服务注册到DI服务容器,然后在构造函数中调用它。

这样您就不需要手动创建实例。

services.AddScoped<IMyService, MyService>();

然后

class MyConsumerClass
{
    private readonly IMyService _myService;
    MyConsumerclass(IMyService myService)
    {
         _myService = myService;
    }
}

这样,您无需关心需要将哪些服务初始化(参数化)到构造函数中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM