Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

IoC y DI: Hello, world con Spring Framework

Ya vimos algo de Inversion of Control y Dependency Injection en:

Definiendo Inversion of Control y Dependency Injection
Introducción a IoC y DI: Otro ejemplo web
Introducción a IoC y DI: Un ejemplo web
Introducción a IoC y DI: Hello, world flexible

material producido dentro del Proyecto Hogwarts. En el post donde definía IoC y DI, mencioné la existencia de contenedores de IoC: utilitarios que facilitan el “armado” de los objetos y sus relaciones. En el primer post de la serie, describí el ejemplo más simple posible. Veamos ahora de poder levantar el mismo ejemplo apelando a un contendor de IoC.

Uno de los más conocidos, uno de los primeros, es el Spring Framework de .NET (port de la implementación inicial en Java). Veamos la estructura del ejemplo (que se puede bajar de HelloWorldSpringExample.zip).

 

Vemos que refiere a Spring.Core, una librería que les dejo incluida en el ejemplo. Seguimos teniendo nuestras interfaces IMessageProcessor, IMessageProvider, y nuestras clases concretas MessageProcessor y MessageProvider. Pero nuestro programa ahora ejecuta:

    class Program
    {
        static void Main(string[] args)
        {
            IApplicationContext context = ContextRegistry.GetContext();
            IMessageProcessor processor = (IMessageProcessor)context.GetObject("processor");
            processor.Process();
        }
    }

Spring tendrá a su cargo crear los objetos, a medida que los pedimos. El ContextRegistry es parte de Spring. Levanta información de los objetos que queremos trabajar. Para poder usarlo, tenemos que incluir los namespaces:

using Spring.Context.Support;
using Spring.Context;

En su forma más sencilla, como la de arriba, toma sus datos de la configuración:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" 
      type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    </sectionGroup>
  </configSections>
  <spring>
    <context 
      type="Spring.Context.Support.XmlApplicationContext, Spring.Core">
      <resource uri="file://SpringConfig.xml"/>
      <!--<resource uri="assembly://HelloWorld1/HelloWorld1/EmbeddedSpringConfig.xml"/>-->
    </context>
  </spring>
</configuration>

Se definió un nuevo sectionGroup llamado spring, que es leído por la librería. Ahí se puede poner la configuración de nuestro ejemplo, pero elegí referir a un archivo aparte, así podemos cambiarlo sin tocar la configuración general de la aplicación. Vean que dejé comentado otra forma: incluir ese archivo de configuración como recurso embebido. El SpringConfig.xml está marcado en el proyecto como Copy to Output Directory Always.

El archivo SpringConfig.xml tiene:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns='http://www.springframework.net'>
  <object id='provider' type='HelloWorldSpringExample.MessageProvider'>
    <property name='Message' value='Hello, World'></property>
  </object>
  <object id='processor' type='HelloWorldSpringExample.MessageProcessor'>
    <property name='Provider' ref='provider'/>
  </object>
</objects>

Podemos definir cada objeto, darle:

- un id (nombre)

- un tipo (qué tipo concreto creamos)

- argumentos para su constructor

- valores para sus propiedades

Cuando especificamos un valor podemos poner value=”Hello, world” un valor en concreto, o podemos referir a otro objeto conocido y creable por Spring, usando ref=”provider”.

Entonces, cada objeto lo completamos inyectándole otros objetos via propiedades o argumentos en el constructor.

Notemos la forma en que la propiedad Provider del MessageProcessor es "inyectada": referenciando (atributo ref) a otro objeto que Spring conoce cómo crear.

De esta forma, se pueden levantar grafos de objetos complejos, pidiendo posiblemente uno desde nuestro programa. En este ejemplo, pedimos el objeto con id=processor. Automáticamente, Spring creó el objeto con id=provider, y le inyectó el mensaje que contiene.

Tenemos que ver otro ejemplo de Spring, tener algún ejemplo web, y usar otros contenedores, como Ninject o StructureMap. Y cuando tengamos más experiencia, volveremos a ver qué se consiguió con esto, y qué características tienen los contenedores IoC.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Published Fri, Aug 13 2010 11:37 by lopez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: