2011-01-13 26 views
6

Soy nuevo en este negocio de IoC y DI. Siento que entiendo el concepto si está pasando objetos que son de alcance global, pero no entiendo cómo funciona cuando necesita pasar alrededor de un objeto que tiene un estado lógico específico. Entonces, por ejemplo, si quisiera inyectar un objeto de persona en un objeto de comando de archivo de escritura, ¿cómo podría elegir dinámicamente el objeto de persona correcto? Por lo que he visto, podría construir el objeto por defecto, pero mi desconexión es que no usaría un objeto de persona predeterminado, tendría que ser dinámico. Supongo que el contenedor IoC puede simplemente mantener el estado del objeto para usted a medida que se pasa, pero luego eso supone que se trata de un solo objeto porque no habría seguridad de hilo, ¿verdad? Sé que me estoy perdiendo algo, (tal vez algo así como una clase de fábrica), pero necesito un poco más de información sobre cómo funcionaría.IoC Dependency Injection para objetos con estado (no global)

Respuesta

6

Bien, siempre puede inyectar un Abstract Factory en su consumidor y utilizarlo para crear objetos de ámbito local.

Esto a veces es necesario. Vea estos ejemplos:

Sin embargo, en general se tiende a no utilizar DI para las entidades, pero sobre todo para los Servicios. En cambio, las entidades se crean generalmente a través de algún tipo de repositorio.

+0

¿En general, las entidades no serían parte de la infraestructura de DI en absoluto? ¿Estoy complicando esto? – mytwocents

+1

Correcto: las entidades y los objetos de valor tienden a vivir vidas separadas. En cierto sentido, todavía están gestionados de alguna manera por la infraestructura de DI (idealmente, todo lo es), pero de una manera muy indirecta. Por lo general, se leen y escriben en el almacenamiento permanente a través de repositorios o similares, y * esos * son servicios que forman parte de la infraestructura de DI. –

+0

Ok, pensé que el director DI decía que el objeto Enitity persona debería estar disponible desde el contenedor IoC (a través de la configuración) ... – mytwocents

4

Cuando construye un objeto de servicio (por ejemplo, WriteFileService), inyecta en él lo que necesita internamente para completar su trabajo. Quizás necesite un objeto de sistema de archivos o algo.

El objeto Person en su ejemplo se debe pasar al objeto de servicio como un parámetro para una llamada de método. p.ej. writeFileService.write(person)

+0

Así que no inyectaría el WriteFileService en el objeto de entidad Entity ... así que en este caso, puedo ver cómo se puede usar la entidad sin la infraestructura DI. Aunque es probable que WriteFileService haya utilizado la infraestructura DI cuando se creó (según la necesidad de una clase inyectada que escriba en una salida específica, p.WriterA - escribe en la base de datos, WriterB - derechos a una consola, etc ...). – mytwocents

Cuestiones relacionadas