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

Introducción a IoC y DI: otro ejemplo web

Sigamos explorando Inversion of Control y Dependency Injection, dentro del Proyecto Hogwarts. Anteriores posts del tema:

Introducción a IoC y DI: Un ejemplo web
Introducción a IoC y DI: Hello, world flexible

Simplemente para ver otro ejemplo sencillo de programación con interfaces, veamos de agregar un objeto presenter en un ejemplo web. La forma de llenar la página con datos (dar datos a la vista) y la forma de atender comandos del usuario (un botón de aceptar en un formulario para grabar lo ingresado), lo separamos del "code behind" y le asignamos esa responsabilidad a un objeto Presenter:

Notemos que la vista que va a consumir no es una clase concreta, sino una interfaz. Eso nos va a permitir cambiar la vista, o probar a nuestro objeto presenter sin necesidad de darle una página web para operar, sino algún otro objeto más adecuado para nuestras pruebas.
El código de este ejemplo se puede bajar de PresenterExample.zip.

Esta vez, la solución tiene dos proyectos de librería de clases, y una aplicación web:

 

El primer proyecto se basa en nuestro anterior ejemplo: contiene el servicio, ayudado por repositorios.

El segundo proyecto define la interfaz que tiene que cumplir todas las vistas de lista de Customers, ICustomerListView:

namespace Customers.Presenters {  public interface ICustomerListView
   {
      IEnumerable<Customer> Customers { set; }
   }
}

El Presenter consume tanto a la vista como al servicio:

 public class CustomerPresenter  {
    private ICustomerService service;
    private ICustomerListView view;
    public CustomerPresenter(ICustomerService service, ICustomerListView view)
    {
       this.service = service;
       this.view = view;
    }
    public void Initialize()
    {
      this.view.Customers = this.service.GetCustomers();
    }
 }

Vean que el servicio también lo ve como una interfaz. Finalmente, el código de la página arma todos los objetos y se "conecta" con el Presenter para que éste la maneje. En nuestro ejemplo, sólo para llenar sus datos:

  public partial class _Default : System.Web.UI.Page, ICustomerListView
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                CustomerPresenter presenter = new CustomerPresenter(new CustomerService(new InMemoryCustomerRepository()), this);
                presenter.Initialize();
            }
        }
        public IEnumerable<Customer> Customers
        {
            set
            {
                this.grdCustomers.DataSource = value;
                this.grdCustomers.DataBind();
            }
        }
    }

Este ejemplo es un paso más hacia el tema de esta serie de post: Inversion of Control y Dependency Injection, términos que tenemos que definir. Pero, como en el post anterior, hay algo para mejorar: en el código de la página decidimos qué objetos concretos conectamos en un grafo de objetos colaboradores. Lo que quisiéramos mejorar es la definición de esos objetos concretos: tratar de no tenerlo de alguna forma fijo en el código, sino tener alguna otra manera de instanciarlos y de cambiar cuáles son las clases concretas a usar.

Este material será incluido en el curso online del Southworks Professional Improvement Program en http://pip.southworks.net/ (pueden ir ahí para ir explorando el curso de TDD ya publicado).

Nos leemos!

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

Published Wed, Jul 28 2010 11:23 by lopez

Comments

# re: Introducción a IoC y DI: otro ejemplo web@ Friday, July 30, 2010 3:51 AM

Hola Ángel, lo primero felicitarte por tu blog y especialmente por acercar conceptos de IS a todo el mundo.

Tengo una cuestión sobre ASP.NET MVC y los IoCs; llevo una temporada haciendo un framework para simplificar el desarrollo y flexibilizarlo en .NET, se basa en el MVC de Haselman e implementa varias caracteristicas como bases de datos internacionalizadas, i18n para gestionar recursos y patrones Repository para Linq to Sql.

Dicho esto, ahora me gustaria usar los IoCs para automatizar determinadas tareas, entre ellas la carga de vistas dependiendo del dispositivo que acceda a la web, es decir si detecto un iPad o un movil determinado me gustaria cambiar el ViewEngine.

Otra cosa que me gustaria es usar el IoC para parametrizar los repositorios (son implementaciones de una interfaz templatizadas por el tipo de entidad Linq).

Y por último tambien usarlo para los helpers de forma que pueda cambiar la forma en la que se comportan los formularios (Ajax o Submit por ejemplo).

Despues de este tocho voy al grano, he visto usos de MEF y Unity (que podria usar para la parte de repositorios) y he encontrado Turbine MVC (que parece ideal para la parte de MVC).

¿Que me recomiendas ya que soy nuevo en el tema de IoC y DI?

¿Tienes alguna experiencia similar?

Muchas gracias y sigue con estos geniales articulos!!!

Oscar

# IoC y DI: Hello, world con Spring Framework@ Friday, August 13, 2010 5:38 AM

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

Angel "Java" Lopez

Leave a Comment

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