Professional Documents
Culture Documents
Lugar de Ejecucin:
Centro de cmputo
Tiempo Estimado:
MATERIA:
Que el estudiante:
1. Conozca los fundamentos tericos sobre la programacin en capas en ASP.NET
2. Segmente una aplicacin en capas y niveles dependiendo de la necesidad que se presente
3. Diferencie las funciones de cada una de las capas en una aplicacin
La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de
que sobrevenga algn cambio, solo se ataca al nivel requerido sin tener que revisar entre cdigo mezclado. Un
buen ejemplo de este mtodo de programacin sera el modelo de interconexin de sistemas abiertos.
Adems, permite distribuir el trabajo de creacin de una aplicacin por niveles; de este modo, cada grupo de
trabajo est totalmente abstrado del resto de niveles, de forma que basta con conocer la API que existe entre
niveles.
Todas estas capas pueden residir en un nico ordenador, si bien lo ms usual es que haya una multitud de
ordenadores en donde reside la capa de presentacin (son los clientes de la arquitectura cliente/servidor). Las
capas de negocio y de datos pueden residir en el mismo ordenador, y si el crecimiento de las necesidades lo
aconseja se pueden separar en dos o ms equipos. As, si el tamao o complejidad de la base de datos
aumenta, se puede separar en varios ordenadores los cuales recibirn las peticiones del ordenador en que
resida la capa de negocio.
Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la separacin, esta capa de
negocio podra residir en uno o ms ordenadores que realizaran solicitudes a una nica base de datos. En
sistemas muy complejos se llega a tener una serie de ordenadores sobre los cuales corre la capa de negocio, y
otra serie de ordenadores sobre los cuales corre la base de datos.
En una arquitectura de tres niveles, los trminos "capas" y "niveles" no significan lo mismo ni son similares.
El trmino "capa" hace referencia a la forma como una solucin es segmentada desde el punto de vista lgico:
Presentacin (Conocida como capa Web en aplicaciones Web o como capa de usuario en Aplicaciones
Nativas)
Lgica de Negocio. (Conocida como capa Aplicativa)
Datos. (Conocida como capa de Base de Datos)
Requerimiento
Cantidad
IV. PROCEDIMIENTO
Parte 1: Creacin de base de datos usando SQL Server 2012 para que funcione como fuente de datos
1. Proceda a descargar los recursos complementarios de esta prctica.
2. Proceda a iniciar la herramienta de Microsoft SQL Server Management Studio instalada en su
computadora y desde el Explorador de Objetos, proceda a crear la base de datos Aplicacion_Capas.
Luego ejecute el script a continuacin, que creara las tablas de la bdd a utilizar.
use Aplicacion_Capas
create table Usuarios(
usuario varchar(20) primary key,
password varchar (20) not null,
nombre varchar(50) not null,
apellido varchar(50) not null,
pais int not null,
sexo char(1),
correo varchar(50),
telefono varchar(30)
)
GO
3. Luego de definir la estructura, creara lo siguientes procedimientos almacenados, de tal manera que
sea la base de datos la que se encargue de realizar las gestiones de datos sobre la base de datos
misma. Ejecute los siguientes bloques de SQL.
Si alguno le da error, proceda a ejecutarlos de forma individual.
create proc insusuario(
@usuario varchar(20) ,
@password varchar (20) ,
@nombre varchar(50) ,
@apellido varchar(50) ,
@pais int,
@sexo char(1),
@correo varchar(50),
@telefono varchar(30)
)
as insert into usuarios values(@usuario,@password,@nombre,@apellido,@pais,@sexo,@correo,@telefono)
GO
4. Ahora nos resta nicamente agregar registros a las tablas. Proceda a ejecutar las siguientes
instrucciones INSERT. Tenga especial cuidado de verificar adonde inicia y adonde terminan las
instrucciones.
insert
into
usuarios
('pedro','demo','Pedro','Rodriguez',21,'M','pedrorodriguez@gmail.com','3827982173')
values
insert into Posts values ('Funcionamiento basico del Foro','Descripcion de Funciones del Foro','juan')
insert into Posts values ('Programando en ASP','Programa basico de asp','pedro')
insert into Posts values ('Crear un foro basico','Hola gente!!! Estoy haciendo un site y en una parte
necesito hacer un foro,
no tiene que ser nada increible ni nada muy grande, solamente poder postear mensajes y autor del mensaje...
El tema es que en este momento me estaba por poner a programarlo y me surgieron varias dudas en cuanto a el
funcionamiento, osea donde guardo los mensajes principalmente... Yo tenia penasdo hacer alguna cosa con
archivos
indexados en una base de datos (mysql) para no cargarla mucho....
Pero antes de ponerme a hacer esto me puse a buscar en internet y encontre que en varios lados "ensean" a
crear
un foro guardando toda la informacion en la base de datos y armando los "threds" haciendo consultas que
filtren
todo lo que no es del tema especificado... en estos lugares que comento guardan el texto, osea el cuerpo
del
mensaje en la base de datos, esto no la enlenteceria???? yo tenia "entendido" que habia que tratar de
guardar
la menor cantidad de informacion posible en las bases para tarden los menos posible en los manejos que
hacen...
pero es solo una idea mia, no se si sera verdad o no...
Alguien sabe como funcionan los foros posta??? o que me recomiendan hacer???
Este ultimo metodo de guardar todo en la base de datos es extremadamente facil,
porque armas los temas con consultas y no te tenes que preocupar de nada...
Pero tengo ganas de hacer algo lo mas "aproximado" a la realidad posible... no algo facilongo para salir
del paso....
Bueno, espero sus propuestas
saludos!!!!!!!','pedro')
insert into Comentarios values ('ana',3,'Hacete un favor y usa algo ya hecho. Con las dudas que tenes, la
magnitud del proyecto te supera ampliamente.',GETDATE())
insert into Comentarios values ('juan',3,'Puede que haya algn otro paquete que sea todava ms simple si
no ests buscando tantos features..',GETDATE())
insert into Comentarios values ('pedro',3,'gracias a todos, pero la verdad es que tengo ganas de hacerlo
yo, porque es algo MUY simple... osea ni siquiera quiero hacer subforos, osea es un lugar donde se agregan
temas y se puede comentar esos temas, no es que entro y tengo 40 subforos... asi que voy a seguir
haciendolo por mi cuenta que de paso aprendo... muchas gracias a todos... saludos!',GETDATE())
insert into Comentarios values ('ana',1,'Como se crea un post??',GETDATE())
insert into Comentarios values ('juan',1,'Solo vaz a mis posts y seleccionas crear un post, le das un
titulo y una descripcion y por ultimo crear post',GETDATE())
insert into Comentarios values ('ana',1,'Gracias otra pregunta, como se borra un comentario??',GETDATE())
namespace Datos
{
class Configuracion
{
static
string
cadenaConexion
=
Catalog=Aplicacion_Capas;Integrated Security=True";
@"Data
Source=localhost;Initial
11. Siempre al interior de la Libreria de Datos, proceda a crear una nueva clase con el nombre
MetodosDatos.cs y proceda a digitar el siguiente cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos
{
class MetodosDatos
{
public static SqlCommand CrearComando()
{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection();
_conexion.ConnectionString = _cadenaConexion;
SqlCommand _comando = new SqlCommand();
_comando = _conexion.CreateCommand();
_comando.CommandType = CommandType.Text;
return _comando;
}
}
}
12. Siempre al interior de la libreria de Datos, crearemos una nueva clase en la capa de datos que se
llamar AccesoDatos.cs y tendra la funcion de autentificar y registrar a los usuarios. Digite el
siguiente cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos
{
public class AccesoDatos
{
public static int insertarUsuario(string usuario, string password, string nombre,
string apellido, int pais, char sexo, string correo, string telefono)
{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insUsuario");
_comando.Parameters.AddWithValue("@usuario", usuario);
_comando.Parameters.AddWithValue("@password", password);
_comando.Parameters.AddWithValue("@nombre", nombre);
_comando.Parameters.AddWithValue("@apellido", apellido);
_comando.Parameters.AddWithValue("@pais", pais);
_comando.Parameters.AddWithValue("@sexo", sexo);
_comando.Parameters.AddWithValue("@correo", correo);
_comando.Parameters.AddWithValue("@telefono", telefono);
return MetodosDatos.EjecutarComando(_comando);
}
return MetodosDatos.EjecutarComandoSelect(_comando);
}
}
}
una
clase
llamada
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos.Views
{
public class misComentariosDatos
{
public static DataTable ObtenerComentarios(string usuario)
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT hora, nombre, comentario FROM comentarios
INNER JOIN posts ON comentarios.idpost = posts.idpost WHERE comentarios.usuario = '" +
usuario + "'";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
}
}
15. De nuevo en la carpeta Views, crea otra clase llamada miperfilDatos.cs y proceda a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos.Views
{
public class miperfilDatos
{
16. En la carpeta Views, agregue otra clase llamada misPostsDatos.cs, y proceder a digitar el siguiente
cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos.Views
{
public class misPostsDatos
{
public static DataTable obtenerMisPosts(string usuario)
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT idpost,nombre,descripcion FROM posts WHERE
usuario = '" + usuario + "'";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
public
static
int
insertarPost(string
nombre,
string
descripcion,
string
usuario)
{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insPost");
_comando.Parameters.AddWithValue("@nombre", nombre);
_comando.Parameters.AddWithValue("@descripcion", descripcion);
_comando.Parameters.AddWithValue("@usuario", usuario);
return MetodosDatos.EjecutarComando(_comando);
}
17. En la carpeta Views, agregue una nueva clase llamada todosPostsDatos.cs y proceda a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Datos.Views
{
public
class todosPostsDatos
{
public static DataTable obtenerTodosPosts()
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM posts";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
public
comentario)
static
int
insertarComentario(string
usuario,
int
post,
string
{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insComentario");
_comando.Parameters.AddWithValue("@usuario", usuario);
_comando.Parameters.AddWithValue("@idpost", post);
_comando.Parameters.AddWithValue("@comentario", comentario);
return MetodosDatos.EjecutarComando(_comando);
}
}
}
20. Luego, en el Explorador de Objetos, de clic sobre la carpeta de esta librera Negocios y agregue una
nueva clase con el nombre AccesoLogica.cs. Aqu proceda a digitar el siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos;
namespace Negocio
{
21. Ahora, crearemos las clases de lgica para cada vista. Cree una nueva carpeta dentro de la librera
Negocio a la que llamar Views.
Dentro de esta agregue una clase llamada misComentariosNeg.cs y proceda a digitar el siguiente
cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos;
using Datos.Views;
namespace Negocio.Views
{
class misComentariosNeg
{
public static DataTable obtenerComentarios(string usuario)
{
return misComentariosDatos.ObtenerComentarios(usuario);
}
}
}
22. Al interior de la carpeta Views, crea otra clase llamada misPostsNeg.cs y procede a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;
namespace Negocio.Views
{
public class misPostsNeg
{
public static DataTable obtenerMisPosts(string usuario)
{
return misPostsDatos.obtenerMisPosts(usuario);
}
return false;
}
catch
{
return false;
}
}
public static bool actualizarPost(string nombre, string descripcion, int post)
{
try
{
if (misPostsDatos.actualizarPost(nombre, descripcion, post) != 0)
return true;
else
return false;
}
catch
{
return false;
}
}
}
}
23. Al interior de la carpeta Views, crea una clase llamada perfilNeg.cs. Procede a digitar el siguiente
cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;
namespace Negocio.Views
{
public
class perfilNeg
{
public static DataTable obtenerDatos(string usuario)
{
return miperfilDatos.obtenerDatos(usuario);
}
}
}
24. Al interior de la carpeta View crear una clase llamada todosPostNeg.cs, y proceder a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;
namespace Negocio.Views
{
class todosPostNeg
{
public static DataTable obtenerTodosPosts()
{
return todosPostsDatos.obtenerTodosPosts();
}
return todosPostsDatos.obtenerComentarios(post);
}
}
}
25. Ahora, procederemos a la creacin de las vistas. En el explorador de soluciones, ubique el icono de la
solucion principal Guia11 y agregue un nuevo Web Form con el nombre Default.aspx.
Proceda a digitar el siguiente cdigo.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
%>
<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
XHTML
1.0
Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div class="page">
<div class="header">
<div class="title">
<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
<div class="clear hideSkiplink">
<asp:Menu
ID="NavigationMenu"
runat="server"
EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">
CssClass="menu"
<Items>
<asp:MenuItem NavigateUrl="~/Principal.aspx" Text="Home"/>
<asp:MenuItem NavigateUrl="~/About.aspx" Text="Acerca"/>
</Items>
</asp:Menu>
</div>
</div>
<div class="main">
<h2>
Inicio de Sesin
</h2>
<div>
<asp:Panel ID="pandefaultbtn" runat="server" DefaultButton="btnEntrar">
<fieldset class="login">
<label>Usuario</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>
ID="txtusuario"
<label>Contrasea</label>
runat="server"
<asp:TextBox ID="txtPassword"
CssClass="passwordEntry"></asp:TextBox>
TextMode="Password"
runat="server"
<div class="clear"></div>
<p></p>
<asp:ImageButton
ID="btnEntrar"
runat="server" Height="40px" Width="134px" />
ImageUrl="~/images/login.png"
<asp:ImageButton ID="btnRegistrar"
runat="server" Height="38px" Width="150px" />
ImageUrl="~/images/register.png"
<asp:Label ID="lblMsg"
Overline="False" Font-Strikeout="False"
runat="server"
Font-Names="Impact"
Font-
ForeColor="Maroon"></asp:Label>
</fieldset>
</asp:Panel>
</div>
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">
</div>
</form>
</body>
</html>
26. Para que nuestro sitio web pueda utilizar las libreras de clases que hemos creado, debemos agregar la
referencia a nuestro proyecto.
En el explorador de soluciones, haga clic con el botn secundario del mouse en el nombre del
proyecto Guia11.
A continuacin, haga clic en Agregar referencia web y seleccione a Negocio.
27. Ya podemos agregar el espacio de nombre a todos nuestros proyectos. Ingrese al archivo
Default.aspx.cs de la pag. anterior y agregue la referencia (resaltada a continuacion) hacia nuestra
librera de clases (Negocios)
type='text/javascript'>//
}
}
29. De manera similar, digite el siguiente cdigo en los respectivos eventos de los botones de esta pagina
Default
30. Cree una nueva pgina con el nombre de Registro.aspx y proceda a digitar el siguiente marcado:
<%@
Page
Language="C#"
Inherits="Registro" %>
AutoEventWireup="true"
<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
CodeFile="Registro.aspx.cs"
XHTML
1.0
Strict//EN"
<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
</div>
<div class="main">
<h2>
Registro de usuarios
</h2>
<div>
<asp:Panel ID="pandefaultbtn" runat="server" DefaultButton="Button1">
<fieldset class="register">
<label>Usuario</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>
ID="txtusuario"
runat="server"
<label>Contrasea</label>
<asp:TextBox ID="txtPassword"
CssClass="passwordEntry"></asp:TextBox>
TextMode="Password"
runat="server"
<label>Nombres</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>
ID="txtNombre"
runat="server"
ID="txtApellido"
runat="server"
<label>Apellidos</label>
<asp:TextBox
CssClass="passwordEntry"></asp:TextBox>
<label>Pas</label>
<asp:DropDownList
ID="ddlPaises"
CssClass="textEntry">
<asp:ListItem Value="1">El Salvador</asp:ListItem>
<asp:ListItem Value="2">Guatemala</asp:ListItem>
<asp:ListItem Value="3">Honduras</asp:ListItem>
<asp:ListItem Value="4">Nicaragua</asp:ListItem>
<asp:ListItem Value="5">Costa Rica</asp:ListItem>
<asp:ListItem Value="6">Panam</asp:ListItem>
</asp:DropDownList>
<label>Sexo</label>
<asp:DropDownList ID="ddlSexo" runat="server">
<asp:ListItem Value="M">Masculino</asp:ListItem>
runat="server"
<asp:ListItem Value="F">Femenino</asp:ListItem>
</asp:DropDownList>
<label>E-mail</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>
ID="txtCorreo"
runat="server"
ID="txtTelefono"
runat="server"
<label>Telfono</label>
<asp:TextBox
CssClass="passwordEntry"></asp:TextBox>
<div class="clear"></div>
<p></p>
<asp:Button
ID="Button1"
CssClass="submitButton" OnClick="Button1_Click" />
<asp:Label
ID="lblMsg"
runat="server"
runat="server"
Font-Overline="False"
Strikeout="False"
ForeColor="Maroon"></asp:Label>
</fieldset>
</asp:Panel>
</div>
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">
</div>
</form>
</body>
</html>
Text="Registrar"
Font-
32. Ahora, cree una carpeta llamada Views. Aqu crearemos dos de las vistas a utilizar en nuestro
proyecto.
Dentro de esta carpeta cree la pgina Perfil.aspx y digite el siguiente marcado:
<%@
Page
Language="C#"
Inherits="Views_Perfil" %>
AutoEventWireup="true"
<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
CodeFile="Perfil.aspx.cs"
XHTML
1.0
Strict//EN"
<div class="title">
<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
<div class="clear hideSkiplink">
<asp:Menu
ID="NavigationMenu"
runat="server"
EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">
CssClass="menu"
<Items>
<asp:MenuItem
Text="Inicio"></asp:MenuItem>
NavigateUrl="~/Default.aspx"
</div>
</form>
</body>
RowStyle-
</html>
33. Ingrese al archivo (Perfil.aspx.cs) de la nueva pagina y agregue el siguiente espacio de nombre
Negocio.Views.
35. Dentro de la carpeta Views cree una nueva pgina llamada MisPost.aspx y digite el siguiente
marcado:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MisPost.aspx.cs" Inherits="MisPost"
%>
<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML
1.0
Strict//EN"
CssClass="menu"
<Items>
<asp:MenuItem
Text="Inicio"></asp:MenuItem>
NavigateUrl="~/Default.aspx"
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">
</div>
</form>
</body>
</html>
36. Ingrese al archivo MisPost.aspx de la pagina anterior e incluya la referencia al espacio de nombres
Negocio.Views.
Despues, proceda a digitar el siguiente cdigo en el Page_Load de esta pgina.
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Nombre"] != "")
{
Repeater1.DataSource
misPostsNeg.obtenerMisPosts(Session["Nombre"].ToString());
Repeater1.DataBind();
}
}
V. BIBLIOGRAFA
1.
Thierry GROUSSARD. (2013). C# 5: Los fundamentos del lenguaje Desarrollar con Visual Studio 2012 .
Barcelona: ENI.