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

时间:2018-12-12 12:47:43

标签: c# asp.net-core

我试图了解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对象,我该从哪里得到它?

2 个答案:

答案 0 :(得分:6)

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

无论您在应用程序中的哪个位置,该原则均适用。由于入口点始终是由系统创建的,因此您始终处于依赖项注入上下文中,因此您可以仅依赖本身具有依赖项的东西(再次可能具有更多依赖项等)。

我强烈建议您阅读文档的chapter on dependency injection,因为它很好地涵盖了这个想法。它还解释了不同生命周期的含义。

答案 1 :(得分:0)

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

通过这种方式,您无需手动创建实例。

services.AddScoped<IMyService, MyService>();

然后

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

通过这种方式,您无需担心需要将哪些服务初始化(参数化)到构造函数中。