如何将我自己的 类 注入 ASP.NET MVC Core 中的控制器?
How do I inject my own classes into controllers in ASP.NET MVC Core?
我为名为 UserManager
的用户管理创建了自己的 class。我希望控制器能够访问 UserManager
对象以登录或注册用户。
我知道我必须在控制器 class 中提供一个参数化构造函数,它接受一个 UserManager
的对象并将其分配给私有属性等
但是 where 和 how 我要在我的项目中注册我的 class 以便它会被自动注入ASP.NET MVC 核心框架?
在ConfigureServices(IServiceCollection services)
方法中Startup.cs
class添加:
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
将 IOperationTransient
、IOperationScoped
或 IOperationSingleton
换成您自己的 class / 需要注入的服务。
注入服务的注册方式有以下三种:
- 瞬态 - 每次请求时都会创建这些服务。
- Scoped - 这些服务将根据请求创建一次。
- 单例 - 这些服务在第一个请求时创建一次,然后每个后续请求都会收到相同的实例。
类 注入依赖项通常不使用具体的 classes (UserManager.cs
) 作为构造函数参数,而是依赖接口,例如IUserManager
。虽然可以使用具体的 classes,但接口提供了更松散的耦合,这是首先使用依赖注入的原因。
每当框架遇到 "wants" 接口的构造函数(在本例中是控制器的构造函数)时,它也会查找应该使用哪个具体 class 进行注入。
在哪里
"class wants type X"和"framework will inject it with type Y"的关系在Startup.cs.[=25=中的ConfigureServices
方法中定义]
什么
1。决定创建对象的生命周期
定义上述关系有三个选项,依赖注入框架创建的对象的生命周期不同。
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
实现了接口 ILogin
和 IRegister
:
控制器
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();
...
我为名为 UserManager
的用户管理创建了自己的 class。我希望控制器能够访问 UserManager
对象以登录或注册用户。
我知道我必须在控制器 class 中提供一个参数化构造函数,它接受一个 UserManager
的对象并将其分配给私有属性等
但是 where 和 how 我要在我的项目中注册我的 class 以便它会被自动注入ASP.NET MVC 核心框架?
在ConfigureServices(IServiceCollection services)
方法中Startup.cs
class添加:
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
将 IOperationTransient
、IOperationScoped
或 IOperationSingleton
换成您自己的 class / 需要注入的服务。
注入服务的注册方式有以下三种:
- 瞬态 - 每次请求时都会创建这些服务。
- Scoped - 这些服务将根据请求创建一次。
- 单例 - 这些服务在第一个请求时创建一次,然后每个后续请求都会收到相同的实例。
类 注入依赖项通常不使用具体的 classes (UserManager.cs
) 作为构造函数参数,而是依赖接口,例如IUserManager
。虽然可以使用具体的 classes,但接口提供了更松散的耦合,这是首先使用依赖注入的原因。
每当框架遇到 "wants" 接口的构造函数(在本例中是控制器的构造函数)时,它也会查找应该使用哪个具体 class 进行注入。
在哪里
"class wants type X"和"framework will inject it with type Y"的关系在Startup.cs.[=25=中的ConfigureServices
方法中定义]
什么
1。决定创建对象的生命周期
定义上述关系有三个选项,依赖注入框架创建的对象的生命周期不同。
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
实现了接口 ILogin
和 IRegister
:
控制器
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();
...