我试图了解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对象,我该从哪里得到它?
答案 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;
}
}
通过这种方式,您无需担心需要将哪些服务初始化(参数化)到构造函数中。