我如何更好地处理从服务中导出方法?

问题描述 投票:0回答:1

我正在尝试找到一种更好的方式来组织我的代码库(我的服务)。现在,我有一个用于服务和一个类的文件夹(例如AuthService.ts),并且在其中有我的方法(例如:registerUser,loginUser)。

我打算做这样的事情:

// AuthService/registerUser.ts
class RegisterUser {
  public async handler (userData: UserData) {
    // code to register user
    return user
  }
}
export default new RegisterUser().handler

// ./AuthService/loginUser.ts
class LoginUser {
  public async handler (userData: UserCredentials) {
    // code to login user 
    return {user, token}
  }
}
export default new LoginUser().handler

// ./AuthService/index.ts
import loginUser from './loginUser'
import registerUser from './registerUser'
export default {loginUser, registerUser}

// Controller
import AuthService from 'App/Services/AuthService'
export default class SessionsController {
public async register ({ request }: HttpContextContract) {
    const { name, email, password } = request.post()
    const user = await AuthService.registerUser({ name, email, password })
    if (!user) {
      console.log('failed!?')
    }
    return { user }
  }
}

我在新类中分离了所有方法。我制作了一个index.ts文件,以更轻松地导出所有这些方法(不要破坏我的旧实现),但是我可以仅导入所需的特定方法而不是所有服务。

这是在AdonisJS v5上写的,但真正的疑问是关于结构,导入/导出和体系结构。

这种方法有什么问题吗?用多种方法更好地组织服务的正确方法是什么? (这是一个示例,实际上还有4种方法..还有几种方法...)

node.js typescript design-patterns adonis.js
1个回答
0
投票

I。 Is there anything wrong with this approach?

->

除了您的类导出方法的小问题。

export default new ClassName().method表示无论您何时执行import,应用程序都会创建一个新的ClassName实例。正如我所说的,这不是一个大问题,但请考虑以下2个解决方案:

  • 注册一个应用singleton->我认为我们不需要:D
  • 使用静态方法,以防您可以处理没有非静态属性的内容。然后导出应为export default ClassName.method

II。 What should be the right way to better organize a Service with a lot of methods?

-> 我不确定:D但这是我的做法。与您的相似。

结构:

  Services
  |-- Service1
  |--|-- method1AsClass.ts
  |--|-- method2AsClass.ts
  |--|-- index.ts

methodXAsClass.ts

class methodAsClassX {
  static attr1: <type>;

  private static async helper1 () {
    // code. Eg:
    fn(MethodAsClassX.attr1) 
  }

  private static async helper1 () {
     // code
  }

  public static async invoke (param: <Param1DataType>) {
    // code
    return result
  }
}
export default methodAsClassX.invoke

index.ts

import method1 from './method1AsClass'
import method2 from './method2AsClass'

export default {method1, method2}

用法:

import Service1 from 'App/Services/Service1'
or
import {method1} from 'App/Services/Service1'
© www.soinside.com 2019 - 2024. All rights reserved.