我创建了自己的用户管理类UserManager
。我希望控制器能够访问UserManager
对象以登录或注册用户。
据我所知,我必须在控制器类中提供一个参数化构造函数,该构造函数接受UserManager
的对象并将其分配给私有属性等。
但 where 和如何我在项目中注册我的类,以便它将由ASP.NET MVC Core框架自动注入?
答案 0 :(得分:5)
在ConfigureServices(IServiceCollection services)
类的Startup.cs
方法中添加:
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
为您自己需要注入的类/服务换出IOperationTransient
,IOperationScoped
或IOperationSingleton
。
注册注射服务有三种方法:
答案 1 :(得分:-1)
注入依赖项的类通常不使用具体类(UserManager.cs
)作为其构造函数参数,但依赖于接口,例如IUserManager
。虽然可以使用具体的类,但是接口提供了更松散的耦合,这是首先使用依赖注入的原因。
每当框架遇到一个“想要”接口的构造函数(在这种情况下是控制器的构造函数)时,它也会查找它应该用于注入的具体类。
Startup.cs 中的ConfigureServices
方法中定义了“类想要类型X”和“框架将它注入类型Y”之间的关系。
定义上述关系有三个选项,在依赖注入框架创建的对象的生命周期中有所不同。
<强>瞬态强>
每次请求时都会创建瞬态生命周期服务。 这种生命周期最适合轻量级无状态服务。
<强>作用域强>
每个请求都会创建一次范围生命周期服务。
<强>的Singleton 强>
Singleton生命周期服务是在第一次创建时创建的 请求(或者在指定实例时运行ConfigureServices时) 那里)然后每个后续请求将使用相同的实例。
选择生命周期(在以下示例中作用域)后,添加行
services.AddScoped<IInterfaceUsedByControllerParameter, ClassThatWillBeInjected>();
或OPs类
services.AddScoped<IUserManager, UserManager>();
或UserManager
实现多个接口:
services.AddScoped<ILogin, UserManager>();
services.AddScoped<IRegister, UserManager>();
当这两行需要带有这两个接口之一的构造函数参数时,依赖注入将为它提供类型为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;
}
...
...
}
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<ILogin, UserManager>();
services.AddScoped<IRegister, UserManager>();
...
services.AddMvc();
...