Adicionar items a una lista personalizada en SharePoint usando el patrón MVP

Como desarrollador de la plataforma “SharePoint”
Quiero adicionar un nuevo item a una lista personalizada, utilizando el patrón MVP (Model–view–presenter)
Para poder tener un desacople mayor entre la tecnología de interfaz de usuario y la lógica de la aplicación.

Gran parte del diseño de software implica una pregunta constante: ¿a dónde quiero llegar con este código? Siempre estoy buscando la mejor manera de organizar mi código para hacerlo más fácil de escribir, más fácil de comprender y más fácil de modificar después. Si consigo estructurarlo bien, me traerá fama y gloria. Pero si lo estructuro mal, los desarrolladores que me sucedan maldecirán mi nombre por toda la eternidad.

Ff649571.354b3e51-0023-46a2-9288-4cf5744594f0(en-us,PandP.10).png

Es por eso que el uso de patrones de diseño nos ayudara en nuestro camino a la gloria, para esta nueva entra del blog, quiero mostrarles como realizar una simple adición de items a una lista personalizada de SharePoint (previamente creada) utilizando el patrón MVP con el fin de lograr un desacople mayor entre la tecnología de interfaz de usuario y la lógica de la aplicación, para en futuros posts mostrarles como implementar pruebas unitarias en SharePoint utilizando Pex & Mole.

Lo primero que haremos sera crear un proyecto en Visual Studio para SharePoint utilizando como plantilla un Visual Web Part, seguidamente crearemos 3 carpetas.

  1. Modelo: Estará toda la lógica de negocio como tal
  2. Presentador: Contendrá clases e interfaces encargadas de desacoplar la comunicación entre el Modelo y la Vista
  3. Vista:  Contendrán el visual web part que crearemos, esta sera nuestra tecnología de interfaz de usuario.

Solution

En nuestra carpeta de Modelo vamos a crear dos clases:

La primera sera nuestra entidad llamada “Contacto” el cual contendrá el siguiente código:

public class Contacto
    {
        public string Nombre { get; set; }
        public string Identificacion { get; set; }
    }

La segunda sera llamada “RepositorioContacto” y contendrá todo el código necesario para realizar la adición del nuevo item en la lista.

public class RepositorioContacto
    {
        internal static void Guardar(Contacto _contacto)
        {
            String webUrl = "http://sharepointser";

            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (var site = new SPSite(webUrl))
                {
                    using (var web = site.OpenWeb())
                    {
                        SPListItemCollection list = web.Lists["Contactos"].Items;

                        SPListItem item = list.Add();
                        item["Title"] = _contacto.Nombre;
                        item["Identificacion"] = _contacto.Identificacion;

                        var allowUnsafeUpdates = web.AllowUnsafeUpdates;
                        web.AllowUnsafeUpdates = true;

                        item.Update();

                        web.AllowUnsafeUpdates = allowUnsafeUpdates;
                    }
                }
            });
        }
    }

En la carpeta Presentador crearemos una interfaz llamada “IVistaContactos” que servirá como nuestro contrato para la vista aquí definiremos las propiedades que deberán ser implementadas por las tecnologías de interfaz de usuario, en nuestro caso expondremos las siguientes propiedades:

public interface IVistaContactos
    {
        string Nombre { get; set; }
        string Identificacion { get; set; }
    }

Y una clase llamada “PresentadorContacto” encargada de la comunicación entra la vista y el modelo. Como sabemos, el presentador sera el único que conozca de la existencia de un modelo y una interfaz de usuario, aunque de hecho el presentador no sabe que tecnología es realmente, pues el trabajara con su contrato el IVistaContactos, por eso necesitamos ahora agregar una referencia a nuestro proyecto de Modelo y escribir el método constructor de esta clase para inicializar el objeto de la interfaz (recuerden que no se pueden crear instancias de una interfaz). El código de nuestra clase nos queda así:

public class PresentadorContacto
    {
        private readonly IVistaContactos _vista;
        private Contacto _contacto;

        public PresentadorContacto(IVistaContactos vista)
        {
            _vista = vista;
            _contacto = new Contacto();
        }

        public void GuardarContacto()
        {
            _contacto.Identificacion = _vista.Identificacion;
            _contacto.Nombre = _vista.Nombre;

            RepositorioContacto.Guardar(_contacto);
        }

        public void InicializarVista()
        {
            _vista.Identificacion = string.Empty;
            _vista.Nombre = string.Empty;

        }

    }

Con esto ya tenemos todo el “esqueleto” de lo que debemos consumir, finalmente en nuestra carpeta Vista, tendremos el Visual Web Part donde nuestro código frontend sera:

FrontEnd

En el code Behind de este archivo, implementaremos la interfaz IVistaContacto y tendremos el siguiente código:

public partial class ContactosMVP : WebPart, IVistaContactos
    {
        private readonly PresentadorContacto presentador;

        public ContactosMVP()
        {
            presentador = new PresentadorContacto(this);
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            InitializeControl();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                presentador.InicializarVista();
            }
        }

        #region IVistaContactos
        public string Nombre
        {
            get { return !string.IsNullOrEmpty(txtNombre.Text) ? txtNombre.Text : string.Empty; }
            set { txtNombre.Text = value.ToString(); }
        }

        public string Identificacion
        {
            get { return !string.IsNullOrEmpty(txtIdentificacion.Text) ? txtIdentificacion.Text : string.Empty; }
            set { txtIdentificacion.Text = value.ToString(); }
        }
        #endregion

        protected void txtGuardar_Click(object sender, EventArgs e)
        {
            presentador.GuardarContacto();

        }
    }

Esto es todo, si quieres descargar el código fuente de esta solución haz clic aquí.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s