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

时间:2017-08-03 15:18:12

标签: c# dependency-injection asp.net-core-mvc asp.net-core-1.1

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

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

where 如何我在项目中注册我的类,以便它将由ASP.NET MVC Core框架自动注入?

2 个答案:

答案 0 :(得分:5)

ConfigureServices(IServiceCollection services)类的Startup.cs方法中添加:

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

为您自己需要注入的类/服务换出IOperationTransientIOperationScopedIOperationSingleton

注册注射服务有三种方法:

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

答案 1 :(得分:-1)

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

每当框架遇到一个“想要”接口的构造函数(在这种情况下是控制器的构造函数)时,它也会查找它应该用于注入的具体类。

其中

Startup.cs 中的ConfigureServices方法中定义了“类想要类型X”和“框架将它注入类型Y”之间的关系。

什么

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

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

official documentation说:

  

<强>瞬态

     

每次请求时都会创建瞬态生命周期服务。   这种生命周期最适合轻量级无状态服务。

     

<强>作用域

     

每个请求都会创建一次范围生命周期服务。

     

<强>的Singleton

     

Singleton生命周期服务是在第一次创建时创建的   请求(或者在指定实例时运行ConfigureServices时)   那里)然后每个后续请求将使用相同的实例。

2。添加代码

选择生命周期(在以下示例中作用域)后,添加行

services.AddScoped<IInterfaceUsedByControllerParameter, ClassThatWillBeInjected>();

或OPs类

services.AddScoped<IUserManager, UserManager>();

UserManager实现多个接口:

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

当这两行需要带有这两个接口之一的构造函数参数时,依赖注入将为它提供类型为UserManager的对象。

代码示例

如果UserManager实现接口ILoginIRegister的最后一个示例:

的Controler

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();
            ...