如何将我自己的 类 注入 ASP.NET MVC Core 中的控制器?

How do I inject my own classes into controllers in ASP.NET MVC Core?

我为名为 UserManager 的用户管理创建了自己的 class。我希望控制器能够访问 UserManager 对象以登录或注册用户。

我知道我必须在控制器 class 中提供一个参数化构造函数,它接受一个 UserManager 的对象并将其分配给私有属性等

但是 wherehow 我要在我的项目中注册我的 class 以便它会被自动注入ASP.NET MVC 核心框架?

ConfigureServices(IServiceCollection services)方法中Startup.csclass添加:

services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();

IOperationTransientIOperationScopedIOperationSingleton 换成您自己的 class / 需要注入的服务。

注入服务的注册方式有以下三种:

  1. 瞬态 - 每次请求时都会创建这些服务。
  2. Scoped - 这些服务将根据请求创建一次。
  3. 单例 - 这些服务在第一个请求时创建一次,然后每个后续请求都会收到相同的实例。

类 注入依赖项通常不使用具体的 classes (UserManager.cs) 作为构造函数参数,而是依赖接口,例如IUserManager。虽然可以使用具体的 classes,但接口提供了更松散的耦合,这是首先使用依赖注入的原因。

每当框架遇到 "wants" 接口的构造函数(在本例中是控制器的构造函数)时,它也会查找应该使用哪个具体 class 进行注入。

在哪里

"class wants type X"和"framework will inject it with type Y"的关系在Startup.cs.[=25=中的ConfigureServices方法中定义]

什么

1。决定创建对象的生命周期

定义上述关系有三个选项,依赖注入框架创建的对象的生命周期不同。

official documentation 说:

Transient

Transient lifetime services are created each time they are requested. This lifetime works best for lightweight, stateless services.

Scoped

Scoped lifetime services are created once per request.

Singleton

Singleton lifetime services are created the first time they are requested (or when ConfigureServices is run if you specify an instance there) and then every subsequent request will use the same instance.

2。添加代码

选择生命周期(以下示例中的范围)后,添加行

services.AddScoped<IInterfaceUsedByControllerParameter, ClassThatWillBeInjected>();

或 OP class

services.AddScoped<IUserManager, UserManager>();

或者如果UserManager实现了几个接口:

services.AddScoped<ILogin, UserManager>();
services.AddScoped<IRegister, UserManager>();

有了这两行,每当 class 需要一个带有这两个接口之一的构造函数参数时,依赖注入将为它提供一个 UserManager.

类型的对象

代码示例

在最后一个示例中,UserManager 实现了接口 ILoginIRegister

控制器

public class UserController : Controller
    {
        private readonly ILogin    _login;
        private readonly IRegister _registration;

        public UserController(ILogin login, IRegister registration)
        {
            _login = login;
            _registration = registration;
        }
...
...
}

Startup.cs

 public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddScoped<ILogin, UserManager>();
            services.AddScoped<IRegister, UserManager>();
            ...
            services.AddMvc();
            ...