2010-08-10 28 views
7

He estado leyendo sobre DDD y creo que puedo estar utilizando servicios incorrectos o al menos de una manera no tan ideal. Mis clases de servicio tienden a tener bastantes variables de instancia que contienen referencias de repositorio y parecen hacer mucho trabajo (es decir, tienen muchos métodos).¿Estoy utilizando la capa de servicio correctamente?

¿Es aconsejable crear servicios más específicos? ¿Como un método por servicio que realiza alguna lógica específica? Además, ¿deberían las clases de servicio almacenar variables de instancia en otras entidades? Leí algo acerca de que los servicios son apátridas, no estoy seguro si estoy rompiendo esa regla al tener esas variables de instancia.

Gracias!

Respuesta

14

Mis clases de servicio tienden a tener bastantes unas pocas variables de instancia ...

esto no es necesariamente un código de olor. Si su servicio requiere muchas dependencias para completar su trabajo, entonces esto es simplemente un hecho.

... parecen hacer un montón de trabajo (es decir, tienen muchos métodos).

¿Es aconsejable crear servicios más específicos?

Como regla general, cuanto más granular puede hacer que sus servicios interfaces (es decir, el menor número de métodos), mejor (siempre tenían que buscar a través de una interfaz con cincuenta métodos en él en busca de la que desea ¿llamar?). Pero a menos que esté publicando como una API pública, la granularidad de sus interfaces de servicio se puede refinar a medida que avanza. A menudo, al comenzar un proyecto, comenzaré con un solo servicio y lo dividiré con el tiempo. Si usted es el consumidor de estos servicios, cuando empiece a sentir el dolor de una interfaz que llega a ser grande, sabrá que es hora de romperla. Por supuesto, si esto es una API pública, a continuación, usted tiene que hacer mucho más el diseño inicial.

Además, ¿deberían las clases de servicio almacenar variables de instancia en otras entidades? Leí algo acerca de que los servicios son apátridas, no estoy seguro si estoy rompiendo esa regla al tener esas variables de instancia.

Almacenar dependencias como variables de instancia no implica necesariamente que su servicio no sea apátrida, siempre que las variables de instancia también sean sin estado. Para que se considere apátrida, las llamadas de método a un servicio no deben depender de ningún modo de los métodos anteriores que hayan sido llamados. Debería poder cargar una única instancia de servicio y compartirla para su aplicación (es decir, una instancia de un servicio sin estado no debe ser específica de la sesión de un usuario en particular). En otras palabras, su servicio no debe mantener ningún estado entre llamadas de método. Almacenar una dependencia de repositorio sin estado como una variable en una instancia de servicio no infringe este requisito.

La razón servicios sin estado es un objetivo deseable, es tener ningún estado reduce en gran medida la posibilidad de errores.Simplifica la prueba de un método de servicio al restringir los casos de prueba a variar los parámetros pasados, en lugar de tener que preocuparse por el estado previo del servicio. También puede ofrecer beneficios de rendimiento.

+0

Gracias por la gran respuesta MJ! Esto ayuda mucho. – chobo

+0

@MJ Richardson ¿Puedes compartir tu ID de correo electrónico (el mío se agrega al perfil)? Tengo ciertas dudas que me gustaría aclarar con respecto a esta publicación. –

0

Yo recomendaría leer sobre la inyección de dependencias, la inversión de control y similares.

Aquí está el artículo de Fowler: http://martinfowler.com/articles/injection.html, aunque yo siempre le pareció un poco por encima. Intentaré recorrer un tutorial que representa el uso de un contenedor DI/IoC.

Cuestiones relacionadas