2009-07-27 24 views
10

Tengo un catálogo de dos repositorios y un usuario, tengo una situación en la que necesito llamar un método dentro del repositorio de catálogo del repositorio del usuario, ¿es esta una buena práctica o hay una forma mejor?Llamar a un repositorio desde un repositorio

+0

El problema. Tengo un comentario relacionado con los métodos dentro de mi catálogo repo. En mi informe de usuario, deseo agregar el método canuserpost (que consultará db para ver si se han realizado suficientes comentarios para permitir su publicación). El código requerido se usará dentro de ambos repositorios, entonces, ¿dónde debería ir, en uno y referencia el otro, ambos, según la referencia de dfa en la capa de servicio u otra cosa? – monkeylee

Respuesta

9

No debe ser el manejo de ese tipo de comprobaciones de autorización dentro de los repositorios. Una regla comercial como "Este usuario requiere X comentarios para publicar" no es realmente una consulta de depósito, es una propiedad de su Usuario.

Además, las llamadas de autorización se realizan con mucha frecuencia en una aplicación, y realmente no desea acceder a su base de datos cada vez que se requiere una verificación.

debe cargar adecuadamente estos permisos en su objeto Usuario que se almacena en caché continuación de la solicitud actual, y el uso de su dominio:

public class Service { 

    public void Save(Post post) 
    { 
     if(User.GetCurrentUser().HasEnoughCommentsToPost()) 
      postRepository.Add(post); 
    } 

} 
+0

+1 para el buen ejemplo – dfa

+0

Creo que el método Save debe ser el método de clase de usuario. Pero luego la clase de usuario necesita saber acerca de postRepo. ¿Es esta una buena idea? – mayu

6

que haría referencia a otro repositorio en la capa superior, tal como una capa de servicio

0

Creo que en su autorización caso es parte de la lógica de dominio. Así que crearía una clase o interfaz abstracta llamada AuthorizationPolicy (tal vez pueda encontrar un nombre mejor cerca de su dominio), en mi capa de dominio. Antes de llamar a un método en el repositorio, el cliente debe verificar si tiene permiso según la política.

Otra solución, porque la interfaz de un repositorio también forma parte de la lógica de negocios, puede crear una clase base para su repositorio que compruebe los permisos del usuario y delegue el resto en las clases derivadas.

La implementación de AuthorizationPolicy se comunicará con la clase Catalog si así lo desea. De esta forma, los dos repositorios están bien desacoplados.

Cuestiones relacionadas