为什么服务没有注入到控制器中?

sbr*_*tla 1 adonis.js

我正在尝试 AdonisJS,但我一直在尝试将服务注入到控制器中。无论我尝试什么,hs构造函数参数VersionsController仍然存在undefined

我还尝试过用 注释构造VersionController函数@inject(['@ioc:Service/HashService']),但没有成功。我不确定@injectAdonis.js v5 是否是正确的方法。

如何正确地将服务类注入控制器?

/providers/AppProvider.ts

    import { ApplicationContract } from '@ioc:Adonis/Core/Application'
    import HashService from 'App/Services/HashService';
    
    export default class AppProvider {
        
        protected app: ApplicationContract;
        
        constructor(app: ApplicationContract) {
            this.app = app;
        }
    
        public register() {
            this.app.container.singleton('@ioc:Service/HashService', () => {
                return new HashService();
            });
        }
    
        public async boot() {
            // IoC container is ready
        }
    
        public async ready() {
            // App is ready
        }
    
    
        public async shutdown() {
            // Cleanup, since app is going down
        }
    }
Run Code Online (Sandbox Code Playgroud)

/app/Services/HashService.ts

    'use strict'
    
    export default class HashService {  
    
        async test() {}
        
    }
    
    module.exports = HashService;
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/Http/VersionsController.ts

    import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
    import { HashService } from '@ioc:Service/HashService'
    
    export default class VersionsController {
        
        protected hs: HashService
    
        constructor(hs: HashService) {
            this.hs = hs;
            console.log("hashservice is " + hs);
        }
    
        public async get(ctx: HttpContextContract) {
            return [
                {
                    id: 1,
                    title: 'a'
                }
            ]
        }
        
        public async put(ctx: HttpContextContract) {
            return "PUT";
        }
        
    }
Run Code Online (Sandbox Code Playgroud)

.adonisrc.json

    'use strict'
    
    export default class HashService {  
    
        async test() {}
        
    }
    
    module.exports = HashService;
Run Code Online (Sandbox Code Playgroud)

ben*_*gri 5

你可以使用Adonisjs/fold

@inject只需在您的服务中使用装饰器即可;

例子;

import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import UserEditValidator from "App/Validators/UserEditValidator";
import UserRepository from "App/Repository/UserRepository";
import {inject} from "@adonisjs/fold";

@inject()
export default class UserService {

  constructor(private userRepository: UserRepository) {
  }

  async update(ctx: HttpContextContract) {
     //do your stuff
     
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中;

import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import UserService from "App/Service/UserService";
import {inject} from "@adonisjs/fold";

@inject()
export default class UserController {

  constructor(private userService: UserService) {

  }

  async edit({ view }){
     return view.render('user/edit', {title: 'Edit Profile'})
  }

  async update(ctx : HttpContextContract){
      await this.userService.update(ctx);

      return ctx.response.redirect().back()

  }
}
Run Code Online (Sandbox Code Playgroud)