我怎样才能更好地处理服务的导出方法?
How can I better handle exporting methods from services?
我正在尝试找到一种更好的方式来组织我的代码库(我的服务)。
现在我有一个用于我的服务的文件夹和一个 class(如 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 }
}
}
我在新的 classes 中分离了所有方法。我创建了一个 index.ts
文件以便更容易导出所有这些方法(不要破坏我的旧实现),但我可以只导入我需要的特定方法而不是所有服务。
这是在 AdonisJS v5 上写的,但真正的疑问是关于结构、import/export 和体系结构。
这种做法有什么问题吗?用很多方法更好地组织服务的正确方法应该是什么? (这是一个例子,实际上还有 4 种方法......还有一些......)
我。 Is there anything wrong with this approach?
-> 否
除了您的方法作为 class 导出器的一个小问题。
export default new ClassName().method
表示每当您执行 import
时,应用程序都会创建一个新的 ClassName
实例。正如我所说,这并不是什么大问题,但请考虑以下 2 种解决方案:
- 注册一个应用程序
singleton
-> 我认为我们不需要 :D
- 如果您可以处理没有非静态属性的事情,请使用静态方法。那么导出应该是
export default ClassName.method
二. 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'
我正在尝试找到一种更好的方式来组织我的代码库(我的服务)。 现在我有一个用于我的服务的文件夹和一个 class(如 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 }
}
}
我在新的 classes 中分离了所有方法。我创建了一个 index.ts
文件以便更容易导出所有这些方法(不要破坏我的旧实现),但我可以只导入我需要的特定方法而不是所有服务。
这是在 AdonisJS v5 上写的,但真正的疑问是关于结构、import/export 和体系结构。
这种做法有什么问题吗?用很多方法更好地组织服务的正确方法应该是什么? (这是一个例子,实际上还有 4 种方法......还有一些......)
我。 Is there anything wrong with this approach?
-> 否
除了您的方法作为 class 导出器的一个小问题。
export default new ClassName().method
表示每当您执行 import
时,应用程序都会创建一个新的 ClassName
实例。正如我所说,这并不是什么大问题,但请考虑以下 2 种解决方案:
- 注册一个应用程序
singleton
-> 我认为我们不需要 :D - 如果您可以处理没有非静态属性的事情,请使用静态方法。那么导出应该是
export default ClassName.method
二. 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'