【问题标题】:Why is the service not injected into the controller?为什么服务没有注入到控制器中?
【发布时间】:2021-11-01 08:38:06
【问题描述】:

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

我还尝试用@inject(['@ioc:Service/HashService']) 注释VersionController 构造函数,但没有成功。我不确定@inject 是否适合 Adonis.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
        }
    }

/app/Services/HashService.ts

    'use strict'
    
    export default class HashService {  
    
        async test() {}
        
    }
    
    module.exports = HashService;

app/Controllers/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";
        }
        
    }

.adonisrc.json

    {
      "typescript": true,
      "commands": [
        "./commands",
        "@adonisjs/core/build/commands/index.js",
        "@adonisjs/repl/build/commands"
      ],
      "exceptionHandlerNamespace": "App/Exceptions/Handler",
      "aliases": {
        "App": "app",
        "Config": "config",
        "Database": "database",
        "Contracts": "contracts"
      },
      "preloads": [
        "./start/routes",
        "./start/kernel"
      ],
      "providers": [
        "./providers/AppProvider",
        "@adonisjs/core"
      ],
      "aceProviders": [
        "@adonisjs/repl"
      ]
    }

【问题讨论】:

    标签: adonis.js


    【解决方案1】:

    你可以使用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
         
      }
    }
    

    然后在你的控制器中;

    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()
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 2018-07-18
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2019-12-15
      • 2017-08-26
      相关资源
      最近更新 更多