Estoy tratando de entender los decoradores que no son anotaciones de Java sino más bien preprocesadores en este artículo y también encontré esta pregunta SO sobre la configuración de información en una función. Digamos que tengo una interfaz así
export default interface UserService { @Path("/users/create") @POST createUser(user: CreateUserRequest): Promise<CreateUserResponse>; @Path("/users/delete") @POST deleteUser(user: DeleteUserRequest): Promise<DeleteUserResponse>; }nota al margen: sería genial usar este cliente generado en la interfaz de usuario de reacción, así como en nodejs
Quiero que mi @Path y @POST, @GET guarden información que puedo leer y creo
class Path(path:string): def __init__(self, path): self.path = path def __call__(self, func): func.pathAnnotation = self return funcLeí que no puedo recorrer los métodos en una interfaz, pero me gustaría generar el cliente http que implementa esta interfaz para que cualquier desarrollador de API cree, automáticamente crea la implementación. (En java, usamos Proxy.java para generar una implementación). En el lado del servidor, el controlador implementa exactamente la misma API y me gusta generar el 'andamio', es decir, la solicitud http a qué punto final llamar si es posible (no estoy seguro de poder hacerlo en nodejs todavía).
EDITAR: una idea: tal vez, creo una clase o clase abstracta y cada método arroja una excepción "Usar XXXFactory para generar la implementación de esta clase". ¿Cómo hago un bucle sobre el método en esa clase? ¿Y puedo crear clases que amplíen todas estas 'apis' en tiempo de ejecución de modo que pueda inyectarlo para que todos lo usen (como Proxy.java en el mundo de Java)?
EDITAR: tal vez podría hacer esto en javascript con una clase prototipo de alguna manera ... generar todos los métodos para llamar a un método con firma
Promise<Object> invoke(String method, object[] paramsToMethod);Luego, puedo buscar el método y las propiedades @Path y @GET/@POST en ese método. ¿Puede una clase prototipo extender una clase en javascript de tal manera que esta clase implemente cualquier API definida (quizás definida en mecanografiado)? Entonces, ¿tengo todas las API implementadas por el mismo código para cada microservicio como lo hacemos en Java? (Esto significa que el equipo de la plataforma puede intercambiar protocolos y los desarrolladores ya no se preocupan por los protocolos como http, http2, binario, etc.)
De acuerdo con la solicitud, me tomé un tiempo para jugar con la reflexión. La reflexión se necesita principalmente para que el cliente se ajuste automáticamente a lo que espera el servicio (tipo de parámetros/tipo de retorno), y creo que podría ser posible con reflect-metadata .
Bien, la idea es que los decoradores almacenen metadatos sobre el método en un mapa, donde una clave es la clase y el valor es una colección de métodos con metadatos.
Luego, donde obtiene el cliente, agrega todos los metadatos para cada método en una función que se puede usar.
Es un comienzo vago, pero creo que puede funcionar. De hecho, también podría convertir esto en un pequeño fragmento o biblioteca si tengo tiempo.
Pero en realidad, este debería ser un cliente generado estáticamente, no uno dinámico. Porque entonces es mucho más fácil validar y generar el código.