2012-01-24 27 views
12

Tengo un componente que necesita actualizar la base de datos para el cliente y la dirección del cliente (a través de JDBC). ¿Es apropiado llamar a CustomerAddressDAO desde CustomerDAO? ¿O crea un componente separado "CustomerDataManager" que los llame por separado?¿Puede un DAO llamar a DAO?

+1

¿Qué le impide hacer esto en la capa empresarial? – Andre

Respuesta

24

Usted puede hacerlo, pero eso no significa que deba hacerlo. En estos casos, me gusta usar un Servicio (CustomerService en este caso) que tiene una llamada a método que utiliza ambos DAO. Puede definir la transacción en torno al método de servicio, de modo que si una llamada falla, ambas retroceden.

El problema con los DAO que llaman a otros DAO es que terminará rápidamente con referencias circulares. La inyección de dependencia se vuelve mucho más difícil.

4

Puede llamar a un DAO de otro, pero también considere construir CustomerAddressDAO en CustomerDAO (después de todo, se trata de un cliente y no creo que quiera tener la dirección del cliente sin el cliente).

4

Obviamente, puede hacerlo de diferentes maneras. Pero, para responder correctamente a esta pregunta, debe comenzar por su modelo. En el modelo, vea si la dirección es una entidad (algo con su propia identificación y también utilizada de manera independiente), o es un tipo de valor (algo que solo tiene sentido en el contexto de un cliente.) Entonces tendrá dos casos:

  1. dirección es una Entidad: En este caso, la dirección tiene su propia Dao y de atención al cliente tiene su propio Dao Ni Dao debe acceder a la otra Si hay cierta lógica que necesita para manipular los dos, entonces eso.. tiene que estar en su lógica de aplicación, no en la capa de acceso a datos.

  2. La dirección es un tipo de valor asociado con el cliente: En este caso, la dirección no tiene un DAO separado de itse si. Se está guardando/restaurando como parte del objeto Cliente que lo contiene.

Conclusión: Si se diseñan correctamente, los DAO no se acceden entre sí (en situaciones estándar).

+1

"Si hay alguna lógica que necesita manipular los dos, entonces tiene que estar en la lógica de la aplicación, no en la capa de acceso a datos". - ¿Y si necesita ser transaccional? (Por ejemplo, necesito asegurarme de que tanto el cliente como la dirección se eliminen) – HEATH3N

+0

¡Esta es una muy buena pregunta! Creo que, en ese escenario, tiene sentido tener la dirección como un tipo de valor asociado con el cliente. Esto permite manipular la dirección junto con el cliente, p. eliminación de los dos. –