Skip to content

SandraCardona24/mvp-unity

 
 

Repository files navigation

Configurar MVP con Unity .NET badgeHitCount

Model view presenter pattern with Unity framework (Independency Injection)

Unity Framework

Inyeccion de dependencias

What are MVP and MVC and what is the difference?

Indice

Diagramas.

Diagrama de clases

clases

Diagrama de secuencia (Otro ejemplo)

secuencia

Estructura del proyecto

Crear un proyecto WebForms y agregar los folders Configuration, Presenter e Interfaces.

imagen1

Instalar con Nugget Manager

Package version
Unity.Abastractions 4.1.3.0
Unity.Configuration 5.10.0.0
Unity.Container 5.10.3.0
DotNetNuke.Web 7.4.2

imagen1

imagen1

imagen1

  • Configuration xmls

Crear unity.config en folder Configuration y agregar estructura del tipo

 <register type="UBICACION DE LA INTERFAZ, NOMBRE PROYECTO " mapTo="UBICACION CLASE CONCRETA, NOMBRE PROYECTO/>
<?xml version="1.0" encoding="utf-8"?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <container>    
    <register type="MvpPractica.Interfaces.IPresenterTabla, MvpPractica" mapTo="MvpPractica.Presenters.AR.PresenterTablaAR, MvpPractica"/>
    <!-- <register type="MvpPractica.Interfaces.IPresenterTabla, MvpPractica" mapTo="MvpPractica.Presenters.US.PresenterTablaUS, MvpPractica"/> -->
  </container>
</unity>

En Web.config agregar

  <configSections>
    	<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" />    
  </configSections>
  <unity configSource="Configuration\unity.config" />
  • Clases RouteMapper y BasePage

Route Mapper

using DotNetNuke.Web.Api;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Unity;
using MvpPractica.Interfaces;
using Microsoft.Practices.Unity.Configuration;

namespace MvpPractica
{     
      public class RouteMapper : IServiceRouteMapper, IContainerAccessor
      {
          public static IUnityContainer Container { get; private set; }

          IUnityContainer IContainerAccessor.Container
          {
              get
              {
                  return Container;
              }
          }

          public void RegisterRoutes(IMapRoute mapRouteManager)
          {
              //seteo ioC
              CreateContainer();               
          }

          public static void CreateContainer()
          {
              IUnityContainer container = new UnityContainer();

              container.LoadConfiguration();

              Container = container;
          }
      }
  }

Base Page

using System;  
  using System.Collections.Generic;  
  using System.Linq;  
  using System.Web;  
  using System.Web.UI;  
  using Unity;  
    
  namespace MvpPractica	{  
      public class BasePage<T> : Page where T : class  
      {  
          public BasePage()
      {  
              InjectDependencies();  
          }  
    
          protected virtual void InjectDependencies()
          {  
              try  
              {  
                  if (RouteMapper.Container == null)  
                  {  
                      RouteMapper.CreateContainer();  
                  }  
    
                  IUnityContainer container = RouteMapper.Container;  
    
                  container.BuildUp(this as T);  
              }  
              catch (Exception ex)  
              {  
                  throw ex;  
              }  
          }  
    
      }  
  }  

Ejemplo básico

Crear dos bases de datos una para AR y otra para US con las tablas Empleado y Empresa. Cargar las bases de datos con EntityFramework.

imagen

Interfaces.

public interface IMainView
{   
  string LabelTabla { set; get; }
  GridView UserGridView { set; get; }
}
    public interface IPresenterTabla
    {
        void SetView(IMainView view);
        void CargarTablaEmpleados();
        void CargarTablaEmpresas();    
    }

Presenters.

//Clase abstracta
    public abstract class PresenterTabla : IPresenterTabla
    {
        public IMainView _view;

        public abstract void CargarTablaEmpleados();

        public abstract void CargarTablaEmpresas();      

        public void SetView(IMainView view)
        {
            this._view = view;
        }      
    }
   

public class PresenterTablaAR : PresenterTabla    {

	public override void CargarTablaEmpleados()
	{
	   //En PresenterTablaUS cambia por 
	   // using (BDEEUUEntities bd = new BDEEUUEntities())
	    using (BDArgentinaEntities bd = new BDArgentinaEntities())
	    {
	   	this._view.LabelTabla = "Empleados de Argentina";
		this._view.UserGridView.DataSource = bd.Empleadoes.ToList();
		this._view.UserGridView.DataBind();
	    }
	}

	public override void CargarTablaEmpresas()
	{
	    using (BDArgentinaEntities bd = new BDArgentinaEntities())
	    {
	   	this._view.LabelTabla = "Empresas de Argentina";
		this._view.UserGridView.DataSource = bd.Empresas.ToList();
		this._view.UserGridView.DataBind();
	    }
	}
} 

Vista.

Agregamos un DataGridView en About.aspx

    public partial class About : BasePage<About>, IMainView
    {
        [Dependency]
       
       public IPresenterTabla _presenterTabla { get; set; }       
       public GridView UserGridView{ get => GridView1; set => GridView1 = value; }
       public string LabelTabla { get => LabelMensaje.Text; set => LabelMensaje.Text = value; }

        protected void Page_Load(object sender, EventArgs e)
        {

            _presenterTabla.SetView(this);           
          
        }

        protected void ButtonEmpleados_Click(object sender, EventArgs e)
        {
            _presenterTabla.CargarTablaEmpleados();
        }

        protected void ButtonEmpresas_Click(object sender, EventArgs e)
        {
            _presenterTabla.CargarTablaEmpresas();
        }
    }

About

Explicacion patron MVP - ProyectoSDSNET-Neoris 2019

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 92.0%
  • Classic ASP 8.0%