Cómo crear relaciones a través de mixins de repositorio en LoopBack 4.
Tengo un requisito donde los modelos y repositorios pueden ser extendidos mediante mezclas con el propósito de agregar campos y relaciones.
En cuanto a agregar campos a los modelos, ya se ha logrado (incluso con algunas limitaciones como no mantener los campos ocultos), pero no puedo crear una mezcla de repositorio que defina una relación en el campo mezclado en el modelo.
Básicamente, no puedo encontrar una forma de obtener el objeto repositoryGetter para configurar la relación en el constructor de la mezcla, como se define en la documentación aquí, ya que los decoradores no se pueden usar en el constructor de la mezcla.
El código incriminado es el siguiente:
“`typescript
// mezclas arriba
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(superClass: R, options?: GenericObject) => {
class Extended extends superClass {
// crear el objeto de acceso alacceso principal de la relación
private user: BelongsToAccessor<OnitUser, ID>;
@repository.getter('OnitUserRepository') public onitUserRepositoryGetter: Getter<OnitUserRepository>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
constructor(...params: any[]) {
super(...params);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore Esta mezcla se aplica a un DefaultCrudRepository. Sabemos que tenemos esta función.
this.log = this.createBelongsToAccessorFor('user', this.onitUserRepositoryGetter);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore Esta mezcla se aplica a un DefaultCrudRepository. Sabemos que tenemos esta función.
this.registerInclusionResolver('user', this.user.inclusionResolver);
}
}
return Extended
}
La forma alternativa de obtener el repositoryGetter que necesito es decorar una sola propiedad, pero parece ser inyectada más tarde en el flujo de instanciación, por lo que no está disponible en el constructor.
¿Alguna sugerencia sobre cómo resolver esto?
davy.ai
El problema es que el objeto repositoryGetter no está disponible en el constructor del mixin, ya que los decoradores no se pueden usar en el constructor. Una manera de solucionar esto es utilizar una función de factoría en lugar de un decorador de clase para crear el mixin. La función de factoría puede recibir el objeto repositoryGetter como parámetro y devolver la clase mixin. De esta manera, el repositoryGetter se puede utilizar para configurar la relación en el constructor del mixin. Aquí tienes un ejemplo:
Luego puedes usar este mixin para extender tu modelo:
Ten en cuenta que hemos definido una clase
BaseEntity
que el mixin extiende, que tiene una propiedaddatasource
que se puede utilizar para especificar el datasource para el modelo.Si quieres agregar un mixin que extienda tanto el modelo como el repositorio, puedes hacerlo de la siguiente manera:
Luego lo puedes usar de la siguiente manera:
Puedes combinar los dos mixins de la siguiente manera:
De esta manera, puedes tener un mixin que extienda tanto el modelo como el repositorio, y agregue una relación entre ellos.</baseentity,></onituser,>