Sie sind auf Seite 1von 27

Programacinen3capas

Holaatodos:
DespusdetantosmesesdetenerabandonadoelBlogporfinhoyseliberaunespacioenmiagenda,tiempo
quehedecididocompartircontodosycadaunodeustedes.
Enestearticulohablareytrataredeexplicarconlosdetallesmasmnimosqueeslaarquitectura3capas,
cualessonsusventajas,comoempezarunproyecto3capas,cualessonlasdiferenciasentrecadaunade
ellas,comocomunicarlasycomocrearunproyectoconlaarquitectura3capasutilizandoVisualStudio2012.
Antesdecomenzaraleerestearticulorecuerdeque:Elobjetivonoesotromasqueeldeorientaralos
Parvulos.Netsobrelaarquitecturadesoftware3capas,todoloescritoenestearticulonoesensayado,noes
revisadopornadiemas,porlocualpodracontenererroresgramaticalesysintcticos,elarticuloysus
conceptosnopretendenserlaverdadabsolutadeltema,sintaseenconfianzadedejarsuscomentariosy
opinionesenlaseccindecomentariosalfinaldelmismoysiloconsideraprudenteenvemeuncorreo
electrnicopormediodelformulariodecontactoyporultimosielarticuloleesdeutilidadporfavorconsidere
dejaruncomentariodeagradecimiento.
Requisitos:VisualStudio2012,Framework4.0,elproveedordedatosSqlCompact4.0instaladoensuequipoy
muchasganasdeaprender.
Comosiemprerecomiendoencarecidamentequeantesdedescargarlosproyectosdeejemplo(quelespondr
alfinaldearticulo),tratendehacerloustedesmismossiguiendopasoapasotodoloquesemencionaraaqu,
sitienendudasenunoenespecificonodudenencontactarme.
Dichotodoloanterior,comencemos
Arquitectura3capasen.Net
Hacreadoustedsoftware?Si?,entoncessabelocomplejoqueresultacrearrutinasyfuncionesparacada
unodelosformularios,importartodaslasreferenciasdelmotordebasededatosencadaunodelos
formularios,cambiarcdigoaquyall(porquetienecopiasdelmismocdigoenmuchoslugares),escribirla
lgicadevalidacindecamposdentrodelevento,corregirlosbugsquepudieranpresentarseynosedigade
implementarlesmejorasalsoftware,etc.,No?entoncesnosepreocupeesteesunbuenmanualdecomo
evitarsemuchosdoloresdecabezaendiseodesuarquitecturaaseguir.
Paraquesedeunamejorideadequehablo,porfavordescargueesteproyectodeejemplo,ejectelo,analice
elcdigo,observecomopararealizarunamismafuncionalidadendoslugaresdiferentestuvimosqueescribir
casilasmismaslneasdecdigo.

Apartirdeaquenadelanteestaremostrabajandoconelproyectodescargado,aplicndolelaArquitectura3
capasparademostrarcomoestaArquitecturadeDiseonosayudaa:
Separarresponsabilidades,cadacapatieneunafuncinespecificaynointervieneconladelasdems.
Reutilizarcdigo
Laseparacinderolesentrescapas,hacemasfcilreemplazaromodificarauna,sinafectaralos
mdulosrestantes
Elcdigodelacapaintermediapuedeserreutilizadopormltiples
CapacidaddemigrarnuestromotordeBasedeDatossingrandesimpactosalrestodelproyecto.
PodercambiarelFrontdenuestraaplicacinsinafectaralalgicadenuestraaplicacinnialaBasede
datos
BiencomoyahemosmencionadoLaArquitecturadediseo3capas,consisteendividireldiseodelsoftware
ensustresprincipalescomponentes:
1.LaInterfazoUI(Userinterface):EstaCapaeslaencargadadeinteractuarconelusuario,esdecir,son
aquellasventanas,mensajes,cuadrosdedilogosopaginasweb(enelcasodeldesarrolloweb),queel
usuariofinalutilizaparacomunicarseconlaaplicacin,pormediodeestacapaelusuariosolicitaquese
ejecutenlastareasproporcionandoparmetrosdeentradayrecibiendodatoscomorespuesta.Estacapa
secomunicaconlacapadeLgicadeNegocio,enviandoysolicitandoinformacinyconlacapade
Entidadesusandosusobjetosparaenviaryrecibirestainformacin.
2.LalgicadenegociooBusinessLogic:Seencargadeimplementar,comosunombrelodice,lalgica
delnegocio,esdecir,todoloqueelSoftwaredebedeconsiderarantesderealizarunaaccinoelproceso
quedebedeseguirdespusderealizarunaaccin.Porejemplo:AntesdesolicitaralacapadeDatosla
insercindeungrupoderegistrosenunatabla,validaquevayantodosloscamposmandatoriosdentrode
esasolicitudsiestacondicinnosecumpleentoncesrechazalainsercineinformadelusuariodelstatus
desusolicitudotroejemplopodriaser,solicitaralabasededatosquevalidelapresenciadeunregistro
antesdeinsertarelsiguiente,validarlostiposdedatos,etc.esosejemplospormencionarlosmasbsicosy
generales.EstacaparecibedelaCapadePresentacinlassolicitudes,validaquelascondicionesque
estableceelnegociosecumplanantesderealizardichaaccinodehacerlarespectivasolicitudalaCapa
deAccesoaDatos
3.ElaccesoaDatosoDataAccess:Estacapaeslaencargadadelacomunicacinconlabasededatos,en
estacapadescansarantodasnuestrasaccionesCRUD(Create,Read,UpdateyDelete),serlanicaque
sabrquemotordebasededatosseestautilizandoperolesercompletamentedesconocidoelfront,
esdecir,jamssabrsinuestraaplicacinesunaaplicacinwebodesktop.Seencargaderecibirlas
peticionesdelaCapadeLgicadeNegocio,ejecutardichasaccionesydevolverelresultadoalamisma
capa.
4.CapadeEntidadesoEntityLayer:Aunqueaparentementeesunacuartacaparealmentenoloes,esta
capaseencargadecontenertodosaquellosobjetos(clases)querepresentanalnegocio,yestaeslanica
quepuedeserinstanciadaenlas3capasanteriores,esdecir,soloellapuedetenercomunicacinconel
restoperosufuncinselimitaanicamenteserunpuentedetransportededatos.Estacapacomplementa
alaCapadeNegocio
Paraunamejorcompresindelacomunicacindelas3capas:

Hastaaqu,hemosvistolateoradeloquerepresentalaArquitectura3Capas,pero
ComoesquedeborepresentarlaArquitectura3CapasenunproyectodeVisualStudio?
Parahayaesadondevamos.
1.AbraelVisualStudio2012ycreeunproyectoVacoynmbreloCSharp3CapasPrimerEntrega

2.DirjasealExploradordesolucionesyhagaclickderechosobreelproyectoqueacabamosdecrear:

3.DelmendesplegadoseleccioneAgregar>NuevoProyecto:

4.Seleccione,Instalado>VisualC#>Windows>AplicacindeWindowsForms>EnelcampoNombre
escriba,TiendaPresentacionypresioneelbotnAceptar.

5.Repitaelpaso2,3yenel4,seleccioneuntipodeproyectoBibliotecadeClasesyestablezcacomo
nombreTiendaLogicaNegocio
6.Repitaelpaso2,3yenel4,seleccioneuntipodeproyectoBibliotecadeClasesutiliceelnombreTienda
AccesoDatos
7.Repitaelpaso2,3yenel4,seleccioneuntipodeproyectoBibliotecadeClasesutiliceelnombre
TiendaEntidades
Comovanuestrodiseo'?

Observequecuandocreamoselproyectoprincipalenautomticosecreounproyectovaco,eliminemosese
proyectoparadejarlasiguienteestructura:

Ahorayatenemosnuestraestructuracompleta,observequecreamos4proyectosdentrodelprincipal(quelo
iniciamoscomoproyectovaco),recuerdequeelproyectodeEntidadesenestecasoTiendaEntidadesnoes
unacapa,masbien,complementaalacapadeLgicadeNegocio.
Continuemosconnuestrodiseo
CapadeEntidades
Recuerdequeenestacapaestarnalojadoslosobjetos(clases)conloscualesestaremostrabajando,con
estosobjetosestaremospersistiendolastablasdelabasededatosqueutilizaremos.
LabasededatosqueusaremoscontieneunasolatablallamadaProductolacualcontiene5campos(Idint,
Descripcinnvarchar,Marcanvarchar,Precionvarchar),porlocuallaCapadeEntidadescontendrun
ObjetollamadoProductocon5propiedadespublicascadaunodeellosrespetandoeltipodedatoconelcual
estadeclaradoenlabasededatos.
ParadeclararnuestraEntidadProducto:
1.AgregueunaclasealproyectoTiendaEntidadesyllmelaEProducto(LaletraEesporconvecin,es
decir,todoslosobjetosdenuestracapadeEntidadesllevaranlaletraEalprincipioparaquedesdedondelas
lleguemosautilizarsepamosqueeseObjetoesunaEntidadevitandoconestoconfusionesconotrosobjetos),
dentroagreguelassiguienteslneasdecdigo:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

namespaceTienda_Entidades
{
publicclassEProducto
{
publicintId{get;set;}
publicstringDescripcion{get;set;}
publicstringMarca{get;set;}
publicdecimalPrecio{get;set;}
}
}
Situviramosmastablasennuestrabasededatostendramosquecrearlamismacantidaddeobjetosen
nuestracapadeEntidadesydentrocontendranlamismacantidaddepropiedadescomocampostienelatabla
siemprerespetandoeltipodedatoconloqueestoscamposestndeclarados.
CapadeaccesoaDatos
Recordemosquelacapadedatosesusadaporlacapadelgicaylacapadelgicaesllamadaporlacapade
presentacin,asqueusaremosesemismoordenparacrearnuestrasconfiguracionesynuestraslneasde
cdigo.
1.Agreguemosunarchivodeconfiguracin(App.Config)anuestracapadedatosrecuerdequeunadelas
caractersticasprincipalesdelarchivodeconfiguracionesesquepodemosestablecerunacadenadeconexin
lacualaccederemosfcilmentedesdecualquierlugardelproyectoquelocontiene,queesloqueenesta
ocasinnosinteresa.
Nuestroarchivodeconfiguracioneslotenemosqueagregarennuestroproyectodepresentacin,ynoporque
lovayaautilizarsinoquenuestrosoftwarecadavezquearranquebuscaraestearchivoeneldirectoriodesde
dondeseesteejecutandolaaplicacin,paraefectosdepruebaserenlacarpeta..bin\debugperocuando
nuestroproyectoesteinstalado,elarchivoquedaradesplegadojustoenlacarpetarazdenuestrainstalacin
juntoconel.exeportalmotivodeberdeestarenelmismoproyectoqueestamarcadocomoproyectode
inicio.
Paraagregarunarchivodeconfiguracionessigaestospasos:
ClickderechosobreelproyectoTiendaAccesoDatos>Agregar>Nuevoelemento

2.Enelproyectoquedescargaronanteriormentesiobservaronvieneembebidaunarchivodebasededatos
llamadoDataBase1.sdfquenoesotracosamasqueunarchivodebasededatospropiosdelmotor
SQlCompact,creeunacarpetaenlaunidadCyllmelaProyecto3Capas,despuscopienestearchivoen
esepath.
3.AbranelarchivodeconfiguracionesdesdeelExploradordesoluciones,Copienlassiguienteslneasde
cdigo,borrenelcontenidodelApp.Configypguenlasensulugar:

<?xmlversion="1.0"encoding="utf8"?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<addname="cnnString"
connectionString="DataSource=C:\Proyecto3Capas\Database1.sdf"
providerName="Microsoft.SqlServerCe.4.0"/>
</connectionStrings>
<startup>
<supportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>

ObservenqueelDataSourceapuntaalacarpetaqueacabamosdecrearenlaunidadCData
Source=C:\Proyecto3Capas\Database1.sdf",estacadenaenproyetosrealesnormalmenteapuntaraaun
servidordedatos,peroparafinesilustrativos,estedirectorionosservirmuybien.
VolvamosanuestraCapadeDatos

4.AgreguemoslasreferenciasalaslibrerasSystem.Configurationparaesto,Clicksobrenuestracapade
datos(proyectoTiendaAccesoDatos)>AgregarReferencia

5.AgregueunasegundareferenciaahoraaSystem.Data.SqlServeCe(estalibreranosiempreaparece,sieste
essucasopresioneelbotnExaminarlocalicelaDlldentrodearchivosdeprogramayseleccinela),presione
Aceptar.

6.YatenemosnuestroApp.Config(enelproyectodearranque)apuntandoanuestrabasededatosytenemos
lasdosreferenciasquenecesitamos,System.Configurationparapoderaccesaryleerelarchivode
configuracionesyelSystem.Data.SqlServerCeparapoderusarlosobjetosdeaccesoadatospropiosdel
motorSQLCOMPACTennuestraCapadeDatos.
ComonuestracapadeAccesoaDatos,debedetenerlacapacidaddeInsertar,Leer,ActualizaryEliminar
registrosdelatablaProductos,requieredeunacomunicacindirectaconlacapadeEntidades,parapor
ejemplo,almomentodequeselesolicitelainsercindeunProductoenlugardeenviarle5parmetrosconlos

datosdelproductoseleenviunObjetoyCualseresteobjeto?nadamasynadamenosquenuestroobjeto
EProductocreadoenlacapadeEntidades,deestamanerayanotrabajaremoscondatossinoconobjetos
llenando,enviandoyleyendopropiedades.
ParalograrlacomunicacinentrelaCapadeDatosylaCapadeEntidadesserequieredelareferenciadeuna
enlaotra,enestecasolareferenciadelaCapadeEntidadesdentrodelaCapadeDatos,paraello:
7.ClickderechosobrenuestroproyectoTiendaAccesoDatos>AgregarReferencia

8.Solucin>Proyectos>SeleccioneTiendaEntidades

ObservecomoseacreadounnuevoelementoennuestracarpetadeReferenciasdelproyectoTienda
AccesoDatos

9.InserteunaclasenuevallamadaProductoDaldedondeDalvendrdeDataAccessLayer,dentrodela
clasequeacabadecreartienequedeclararelespaciodenombresSystem.Configuration,
System.Data.SqlServerCeydelproyectodeEntidades,ademstienequedeclararlaclasecomopublica(para
quelaCapadeLgicadeNegociopuedateneraccesoaella)

YatenemoselpuentedecomunicacinentrenuestrasEntidadesynuestraCapadeDatos.Soloresta
comenzaracodificarlasaccionesquequerramoshacerconnuestratablaProducto,recuerdequeelobjeto
ProductoDalnicamentetienecomoresponsabilidadtrabajarcontodoaquellorelacionadoconProducto,as
quecomencemoshaciendolacodificacinparaInsertar,Traertodoslosregistrosexistentesennuestratabla
Producto,Traer,ActualizaryEliminarporId.
ParahacerestatareamassencillaleproporcionareelcdigoquedeberdeponerenlaclaseProductoDal,
pero,tratedeescribirelcdigoparavayaanalizandolaestructuradelmismo.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

//nuestrasimportacionesdelEspaciodenombresqueestaremosutilizando,
//recuerdequeestassonlasreferenciasquerealizamoshaceunosmomentos...

usingSystem.Configuration;

usingSystem.Data.SqlServerCe;

usingTienda_Entidades;

namespaceTienda_AccesoDatos
{
//Definimoselaccesodenuestraclasecomopublic,asegurandoconestosu
accesibilidaddesde
//otrosproyectos.
publicclassProductoDal
{
//PrimeroysiguiendoelordendelasaccionesCRUD
//CrearemosunMtodoqueseencargadeinsertarunnuevoProductoesnuestra
tablaProducto
///<summary>
///InsertaunnuevoProductoenlatablaProducto
///</summary>
///<paramname="producto">Entidadcontenedoradelosvaloresainsertar</param>
///<autor>JosLuisGarcaBautista</autor>
publicvoidInsert(EProductoproducto)
{
//Creamosnuestroobjetodeconexionusandonuestroarchivode
configuraciones
using(SqlCeConnectioncnx=new
SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
{
cnx.Open();
//DeclaramosnuestraconsultadeAccinSqlparametrizada
conststringsqlQuery=

"INSERTINTOProducto(Descripcion,Marca,Precio)VALUES
(@descripcion,@marca,@precio)";
using(SqlCeCommandcmd=newSqlCeCommand(sqlQuery,cnx))
{
//Elprimerodeloscambiossignificativosconrespectoalejemplo
descargadoesqueaqui...
//yanoleeremoscontrolessinousaremoslaspropiedadesdelObjeto
EProductodenuestracapa
//deentidades...
cmd.Parameters.AddWithValue("@descripcion",producto.Descripcion);
cmd.Parameters.AddWithValue("@marca",producto.Marca);
cmd.Parameters.AddWithValue("@precio",producto.Precio);
cmd.ExecuteNonQuery();
}
}
}
///<summary>
///DevuelveunalistadeProductosordenadosporelcampoIddemanera
Ascendente
///</summary>
///<returns>Listadeproductos</returns>
///<autor>JosLuisGarcaBautista</autor>
publicList<EProducto>GetAll()
{
//DeclaramosunalistadelobjetoEProductolacualserlaencargadade
//regresarunacoleccindeloselementosqueseobtengandelaBD
//
//LalistasubstituyeaDataTableutilizadoenelproyectodeejemplo
List<EProducto>productos=newList<EProducto>();
using(SqlCeConnectioncnx=new
SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
{
cnx.Open();
conststringsqlQuery="SELECT*FROMProductoORDERBYIdASC";
using(SqlCeCommandcmd=newSqlCeCommand(sqlQuery,cnx))
{
SqlCeDataReaderdataReader=cmd.ExecuteReader();
//
//PreguntamossielDataReaderfuedevueltocondatos
while(dataReader.Read())

{
//
//InstanciamosalobjetoEproductoparallenarsuspropiedades
EProductoproducto=newEProducto
{
Id=
Convert.ToInt32(dataReader["Id"]),
Descripcion=
Convert.ToString(dataReader["Descripcion"]),
Marca=
Convert.ToString(dataReader["Marca"]),
Precio=
Convert.ToDecimal(dataReader["Precio"])
};
//
//InsertamoselobjetoProductodentrodelalistaProductos
productos.Add(producto);
}
}
}
returnproductos;
}
///<summary>
///DevuelveunObjetoProducto
///</summary>
///<paramname="idProducto">Iddelproductoabuscar</param>
///<returns>UnregistroconlosvaloresdelProducto</returns>
///<autor>JosLuisGarcaBautista</autor>
publicEProductoGetByid(intidProducto)
{
using(SqlCeConnectioncnx=new
SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
{
cnx.Open();
conststringsqlGetById="SELECT*FROMProductoWHEREId=@id";
using(SqlCeCommandcmd=newSqlCeCommand(sqlGetById,cnx))
{
//
//UtilizamoselvalordelparmetroidProductoparaenviarloal
parmetrodeclaradoenlaconsulta
//deseleccinSQL
cmd.Parameters.AddWithValue("@id",idProducto);

SqlCeDataReaderdataReader=cmd.ExecuteReader();
if(dataReader.Read())
{
EProductoproducto=newEProducto
{
Id=Convert.ToInt32(dataReader["Id"]),
Descripcion=Convert.ToString(dataReader["Descripcion"]),
Marca=Convert.ToString(dataReader["Marca"]),
Precio=Convert.ToDecimal(dataReader["Precio"])
};
returnproducto;
}
}
}
returnnull;
}
///<summary>
///ActualizaelProductocorrespondientealIdproporcionado
///</summary>
///<paramname="producto">ValoresutilizadosparahacerelUpdateal
registro</param>
///<autor>JosLuisGarcaBautista</autor>
publicvoidUpdate(EProductoproducto)
{
using(SqlCeConnectioncnx=new
SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
{
cnx.Open();
conststringsqlQuery=
"UPDATEProductoSETDescripcion=@descripcion,Marca=@marca,
Precio=@precioWHEREId=@id";
using(SqlCeCommandcmd=newSqlCeCommand(sqlQuery,cnx))
{
cmd.Parameters.AddWithValue("@descripcion",producto.Descripcion);
cmd.Parameters.AddWithValue("@marca",producto.Marca);
cmd.Parameters.AddWithValue("@precio",producto.Precio);
cmd.Parameters.AddWithValue("@id",producto.Id);
cmd.ExecuteNonQuery();
}
}

}
///<summary>
///EliminaunregistrocoincidenteconelIdProporcionado
///</summary>
///<paramname="idproducto">IddelregistroaEliminar</param>
///<autor>JosLuisGarcaBautista</autor>
publicvoidDelete(intidproducto)
{
using(SqlCeConnectioncnx=new
SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
{
cnx.Open();
conststringsqlQuery="DELETEFROMProductoWHEREId=@id";
using(SqlCeCommandcmd=newSqlCeCommand(sqlQuery,cnx))
{
cmd.Parameters.AddWithValue("@id",idproducto);
cmd.ExecuteNonQuery();
}
}
}
}
}

ObservecomodesdenuestrosdiferentesMtodosyfuncionesestamoshaciendousodelobjetoEProducto
declaradoenlacapadeEntidadesObservetambincomonuestraclaseProductosDalnovalidaqueelvalor
delaspropiedadesdeEProductocontengandatososeandeltipodedatocorrectoporqueeseestrabajo
de?LaCapadeLgicadeNegocio
CapadeLgicadeNegocio
RecuerdequelacapadeLgicaeslaencargadadeestablecertodalalgicaqueelnegocioestablecepara
llevaracabounaaccinodespusdehaberrealizadounproceso,yestasecomunicadirectamenteconla
CapadeAccesoaDatos,porlocualtenemosquehacerlareferenciaalProyectoTiendaAccesoDatosypara
ello:
1.ClickderechosobrenuestroproyectoTiendaLogicaNegocio>AgregarReferencia

8.Solucin>Proyectos>SeleccioneTiendaAccesoDatosyTiendaEntidades

Observecomoseacabandeagregarnuestrasreferencias:

9.AgregueunanuevaclaseyllmelaProductoBol,hagalosusingdelasreferenciasqueacabamosdecrear,
establezcaelniveldeaccesocomopublicycopielasiguienteestructuradecdigo:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

//
//Hacemoslasimportacionesdelespaciodenombresdelosdosproyectosquereferenciamos
//observecomoestacapasoloreferencioaTiendaAccessDataynoaTiendaPresentacion
//observetambincomoaqunoesrequeridalareferenciaaSystem.Data.SqlServerCe

usingTienda_AccesoDatos;

usingTienda_Entidades;

namespaceTienda_LogicaNegocio

{
publicclassProductoBol
{
//InstanciamosnuestraclaseProductoDalparapoderutilizarsusmiembros
privateProductoDal_productoDal=newProductoDal();
//
//ElusodelaclaseStringBuildernosayudaraadevolverlosmensajesdelas
validaciones
publicreadonlyStringBuilderstringBuilder=newStringBuilder();
//
//CreamosnuestromtodoparaInsertarunnuevoProducto,observecomoeste
mtodotampocovalidaloselcontenido
//delaspropiedades,sinoquemandaallamaraunaFuncinquetienecomotarea
nicahacerestavalidacin
//
publicvoidRegistrar(EProductoproducto)
{
if(ValidarProducto(producto))
{
if(_productoDal.GetByid(producto.Id)==null)
{
_productoDal.Insert(producto);
}
else
_productoDal.Update(producto);

}
}
publicList<EProducto>Todos()
{
return_productoDal.GetAll();
}
publicEProductoTraerPorId(intidProduct)
{
stringBuilder.Clear();
if(idProduct==0)stringBuilder.Append("Porfavorproporcioneunvalorde
Idvalido");
if(stringBuilder.Length==0)
{

return_productoDal.GetByid(idProduct);
}
returnnull;
}

publicvoidEliminar(intidProduct)
{
stringBuilder.Clear();
if(idProduct==0)stringBuilder.Append("Porfavorproporcioneunvalorde
Idvalido");
if(stringBuilder.Length==0)
{
_productoDal.Delete(idProduct);
}
}
privateboolValidarProducto(EProductoproducto)
{
stringBuilder.Clear();
if(string.IsNullOrEmpty(producto.Descripcion))stringBuilder.Append("El
campoDescripcinesobligatorio");
if(string.IsNullOrEmpty(producto.Marca))
stringBuilder.Append(Environment.NewLine+"ElcampoMarcaesobligatorio");
if(producto.Precio<=0)stringBuilder.Append(Environment.NewLine+"El
campoPrecioesobligatorio");
returnstringBuilder.Length==0;
}
}
}

Analicecadaunodelosmtodosyfuncionesquecreamosennuestroprimerobjetodenuestracapade
Negocio,observe:
Cadaunodeellostieneunasolaresponsabilidad
LacapadenegociocumpleotrastareasynosololadeserunpuenteentrenuestraCapadeDatosy
nuestraCapadePresentacin
Comoesqueestamosusandonicamenteobjetosynocontroles,recuerdequeestacapatampocosabe
quetipodeproyectoeselquelaestarusando.
ObservequeestacapanotienereferenciasaSystem.Configurationnimuchomenosa

System.Data.SqlServerCe.
ObservequeenestacapatambinseutilizalaCapadeEntidades.
CapadePresentacinoUserInterface
LetocaelturnoalaCapadePresentacinentrarenescena,estacapaserlaencargadadeinteractuarconel
usuario,lavistadetodonuestrosistema,laencargadaderecogerlaspeticionesdelusuarioydepasaresta
mismaalacapadeLgicadeNegocio,todoloqueelusuariorequieraselasolicitaraaestaytodoloque
LgicadeNegociodevuelvaestaselamostraralusuarioenformadedatos.
ParaconfigurarnuestraCapadePresentacin.
10.HagalasreferenciasalosproyectoTiendaLogicaNegocioyTiendaEntidades

11.EnelformularioquetenemospordefaultllamadoForm1diseeunainterfazcomolasiguiente:

12.Observelassiguienteslneasdecdigo,genereloseventosinvolucradosycopieelcdigodeejemplo:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;
//
//Hacemoslasimportacionesdelespaciodenombresdelosdosproyectosquereferenciamos
//observecomoestacapasoloreferencioaTiendaLogicNegocioyaTiendaEntidades
//observecomonosereferenciaalaclasedeaccesoaDatos

usingTienda_LogicaNegocio;

usingTienda_Entidades;

namespaceTienda_Presentacion
{
publicpartialclassForm1:Form
{
//
//
//CreamoslasinstanciasdelaclaseEproductoyProductoBol
privateEProducto_producto;
privatereadonlyProductoBol_productoBol=newProductoBol();
publicForm1()
{
InitializeComponent();
}
//
//Creamoslosmtodosgeneralesllenandoyleyendoobjetos
//
privatevoidGuardar()
{
try
{
if(_producto==null)_producto=newEProducto();
_producto.Id=Convert.ToInt32(txtId.Text);
_producto.Descripcion=txtDescripcion.Text;
_producto.Marca=txtMarca.Text;
_producto.Precio=Convert.ToDecimal(txtPrecio.Text);
_productoBol.Registrar(_producto);
if(_productoBol.stringBuilder.Length!=0)
{
MessageBox.Show(_productoBol.stringBuilder.ToString(),"Para
continuar:");
}
else
{
MessageBox.Show("Productoregistrado/actualizadoconxito");
TraerTodos();

}
}
catch(Exceptionex)
{
MessageBox.Show(string.Format("Error:{0}",ex.Message),"Error
inesperado");
}
}
privatevoidTraerTodos()
{
List<EProducto>productos=_productoBol.Todos();
if(productos.Count>0)
{
dgvDatos.AutoGenerateColumns=false;
dgvDatos.DataSource=productos;
dgvDatos.Columns["columnId"].DataPropertyName="Id";
dgvDatos.Columns["columnDescripcion"].DataPropertyName="Descripcion";
dgvDatos.Columns["columnMarca"].DataPropertyName="Marca";
dgvDatos.Columns["columnPrecio"].DataPropertyName="Precio";
}
else
MessageBox.Show("NoexistenproductoRegistrado");
}
privatevoidTraerPorId(intid)
{
try
{
_producto=_productoBol.TraerPorId(id);
if(_producto!=null)
{
txtId.Text=Convert.ToString(_producto.Id);
txtDescripcion.Text=_producto.Descripcion;
txtMarca.Text=_producto.Marca;
txtPrecio.Text=Convert.ToString(_producto.Precio);
}
else
MessageBox.Show("ElProductosolicitadonoexiste");
}
catch(Exceptionex)
{

MessageBox.Show(string.Format("Error:{0}",ex.Message),"Error
inesperado");
}
}
privatevoidEliminar(intid)
{
try
{
_productoBol.Eliminar(id);
MessageBox.Show("Productoeliminadosatisfactoriamente");
TraerTodos();
}
catch(Exceptionex)
{
MessageBox.Show(string.Format("Error:{0}",ex.Message),"Error
inesperado");
}
}
//
//
//Usamosnuestrosmetodosyfuncionesgenerales,observecomonohemosrepetido
codigoenningunlado
//haciendoconestoquenuestrastareasdeactualizacionseanmassencillaspara
nosotrosopara
//alasignadoenrealizarlas...
privatevoidbtnAgregar_Click(objectsender,EventArgse)
{
Guardar();
}
privatevoidtxtId_KeyDown(objectsender,KeyEventArgse)
{
if(e.KeyData==Keys.Enter&&!string.IsNullOrWhiteSpace(txtId.Text))
{
e.SuppressKeyPress=true;
TraerPorId(Convert.ToInt32(txtId.Text));
}
}

privatevoidtxtPrecio_KeyDown(objectsender,KeyEventArgse)
{
if(e.KeyData==Keys.Enter)
{
e.SuppressKeyPress=true;
Guardar();
}
}
privatevoidbtbnBuscar_Click(objectsender,EventArgse)
{
if(!string.IsNullOrWhiteSpace(txtId.Text))
{
TraerPorId(Convert.ToInt32(txtId.Text));
}
}
privatevoidbtnEliminar_Click(objectsender,EventArgse)
{
if(!string.IsNullOrWhiteSpace(txtId.Text))
{
Eliminar(Convert.ToInt32(txtId.Text));
}
}
}
}

DenuevoobservecomoestacapadesconocesiexisteunacapadeDatosymuchomenosquemotordebase
dedatosseutiliza,tampocoseencargadeimplementarlasreglasdevalidacinnidelgicadenegocio,su
tareaesinteractuarconelusuariopidiendoydesplegandoinformacin.
Queesloquefalta?
Solonosrestaprobarelproyectoperoeso,sertareasuyaEjecuteelproyecto,inserteunnuevoregistro,
busqueunregistroporid,editesuinformacin,elimineunproducto,depureelcdigolneaalneaparavivade
pasoapasocomoesquevapasandodecapadecapaenviandoytrayendoinformacin.
AquterminanuestroarticulosobreArquitectura3Capas,esperohayasidodesuagradoyquelaexplicacin
hayasidolobastanteclara,encasodequetengaalgunadudaporfavordejesupreguntaenlaseccinde
comentariosoescrbamepormediodelformulariodecontacto.

Escribirestearticulomellevomasde4horas,dejaruncomentariodeagradecimientoletomara5minutos.
SaludosdesdeMonterrey,NuevoLenMxico!
EjemploC#
EjemploVb.Net

Das könnte Ihnen auch gefallen