DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Utilizando .net Remoting , Programación en Capas, Programación Orientada a Objetos y patrones de programación, (SqlServer 2000 Back End)

Por rhernandez | 8/8/2005 | Visitas 6,626 | Voto 0.00
Parte II: Manejo de Entidades y Colecciones
Categorías : C#
<< Regresar al Indice del Artículo

Esta Capa se utiliza para la comunicación o medio de transporte entre las demás capas para llevar y traer datos, regularmente a traves de parametros.
Estas clases dependen de clases bases con ciertas funcionalidades de control interno, como por ejemplo saber el estatus de la entidad, si se a modificado o no, si es nuava, si se quiere eliminar, etc. y todas ellas son seriabilizables para poderlas utilizar como parametros a traves de .net remoting. En resumen, nos sirven de mapeo de las tablas fisicas del SqlServer hacia la memoria.

Maneja dos clases bases, una para Entidades, y otra Para Colecciones.

La clase IEntityBase, debido a que es abstracta, nos obliga a heredarla para cada entidad que vayamos a utilizar, asi compartimos toda la funcionalidad de ella, y tambien, si hacemos un cambio en esta, automaticamente se refleja en todas las entidades.

Dentro de las funcionalidades de esta clase podemos ver la propiedad UltimaActualizacion , la cual nos sirve para controlar la concurrencia de la información, ya que recordemos que cada entidad es el mapeo de un registro de la tabla física del sql.

¿Como funciona?
Supongamos este escenario: Se tiene funcionando el Servicio de Windows de.Net Remoting el cual expone métodos publicos para acceso a datos, suponiendo que uno de ellos es [public Entity.Pais TraerPaises(int pais)], el cual regresa una clase de Tipo Entity.Pais la cual hereda de IEntityBase y recibe un parametro de tipo entero. Siguiendo con las suposiciones, un usuario en la sucursal "X" corre ese metodo y obtiene a memoria una instancia del pais "1", el cual tiene la descripcion "A" y le cambia la descripcion a "B", al mismo tiempo otro usuario en la sucursal "Y", obtiene a memoria tambien la entidad del pais "1", y coincidentemente, le cambia la descripcion a "C" e inmediatamente lo manda almacenar exitosamente. ¿Que pasa cuando el primer usuario almacene el pais 1?

Con el control de la ultima actualizacion nos protegemos de esos escenarios, por que cuando el usuario 1 llamo la entidad Pais a memoria, obtubo de la tabla de SQL el timestamp de la version del registro en la propiedad UltimaActualizacion, cuando el usuario 2 actualiza los datos, automaticamente se modifica la version del registro, asi cuando el usuario 1 pretende actualizar los datos no grabara, debido a que esa entidad que el tiene ya no es la que esta en la tabla de la base de datos, y eso lo controlamos a traves de la UltimaActualizacion.

Otra funcionalidad que se puede ver dentro de la clase base para entidades es EntityEstatus. La cual nos sirve para saber, antes de guardar la informacion, si la entidad tiene cambios o no, o si es nueva, para tomar la desicion de como manejamos la persistencia de ella. Esas validaciones se ven aplicadas en la Capa de Acceso a Datos (DAL).

using System ;
using System.Xml.Serialization;
using System.ComponentModel;
using System.Collections;
namespace Entity
{
/// <summary>
/// clase base para todas las entidades para manejar los estatus
/// </summary>
[Serializable]
public abstract class IEntityBase
{
#region Atributos
private int ultimaActualizacion;
protected Entity.Estatus estatusEntidad;
#endregion

#region Constructor Destructor
/// <summary>
/// Constructor
/// </summary>
protected IEntityBase()
{
this.estatusEntidad = Entity.Estatus.Agregado;
}
#endregion

#region Propiedades
/// <summary>
/// Obtiene o establece un numero hash determinando la ultima vez que se modifico
/// </summary>
public int UltimaActualizacion
{
get{return this.ultimaActualizacion;}
set{this.ultimaActualizacion=value;}
}

/// <summary>
/// Obtiene o Establece un Entity.Estatus para un IEntityBase
/// </summary>
public Entity.Estatus EntityStatus
{
get{return this.estatusEntidad;}
set{this.estatusEntidad = value;}
}

#endregion

#region Métodos Públicos
/// <summary>
/// Acepta los cambios realizados desde la ultima vez que se llamo AcceptChanges
/// </summary>
public void AcceptChanges()
{
this.estatusEntidad = Entity.Estatus.SinCambios ;
}
/// <summary>
/// Determina si la entidad tiene cambios
/// </summary>
/// <returns>bool</returns>
public bool HasChanges()
{
return (this.estatusEntidad == Entity.Estatus.Agregado || this.estatusEntidad == Entity.Estatus.Modificado);
}

/// <summary>
/// Actualiza el estatus de la entidad a modificado
/// </summary>
public void Set()
{
if (this.estatusEntidad == Entity.Estatus.SinCambios)
{
this.estatusEntidad = Entity.Estatus.Modificado;
}
}
/// <summary>
/// Serializa la entidad a un string en formato Xml
/// </summary>
/// <returns><see cref="string"/></returns>
public string ToXml()
{
System.Text.StringBuilder stringBuilder=null;
try
{
System.Xml.Serialization.XmlSerializer serializador = new System.Xml.Serialization.XmlSerializer(this.GetType(),new XmlRootAttribute(this.GetType().ToString()));

stringBuilder = new System.Text.StringBuilder();
System.IO.StringWriter stringWriter = new System.IO.StringWrer(stringBuilder);
serializador.Serialize(stringWriter, this);
}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex.ToString() ,true);
}
return stringBuilder.ToString();
}

#endregionbr>
/// <summary>
/// Marca como borrados al detalle del maestro
/// </summary>
/// <param name="listaElementos">ICollectionBase del detalle a marcaparam>
public void BorrarDetalle(ICollectionBase listaElementos)
{
ArrayList listaBorrados = new ArrayList(listaElementos);
foreach (IEntityBase elemento in listaBorrados)
{
listaElementos.Remove(elemento);
}
}
}
}


Por otro lado tambien tenemos la clase base de las colecciones, que representarian toda una tabla en memoria. Nos permite hacer manejos de informacion masivos. Aqui podemos ver los metodos de toda coleccion, como agregar, eliminar, contador de elementos, etc...

En el caso del método public virtual void Remove(IEntityBase entityBase) , llevamos un control de los elementos que se han eliminado de esta lista en otra lista del mismo tipo, para que posteriormente en la Capa de Acceso a Datos (DAL) se borren fisicamente de la base de datos. Esta coleccion de elementos borrados se obtiene a traves del metodo public ICollectionBase GetDeleted().

using System;
using System.Xml; using System.Xml.Serialization;
namespace Entity
{
/// <summary>
/// clase base de colecciones para todas las colecciones
/// </summary>
///
[Serializable]
public abstract class ICollectionBase : System.Collections.CollectionBase
{
ICollectionBase listaBorrados;

protected ICollectionBase()
{
//listaBorrados = (ICollectionBase)Activator.CreateInstance(this.GetType());
}

/// <summary>
/// Agrega un elemento IEntityBase a la colección
/// </summary>
/// <param name="entityBase">cualquier clase heredada del IEntityBase</param>
/// <returns>int</returns>
public int Add(IEntityBase entityBase)
{
return List.Add(entityBase);
}

/// <summary>
/// Quita el objeto IEntityBase con el objeto especificado
/// </summary>
/// <param name="entityBase">objeto IEntityBase a quitar</param>
public virtual void Remove(IEntityBase entityBase)
{
if (listaBorrados == null)
{
listaBorrados = (ICollectionBase)Activator.CreateInstance(this.GetType());
}
entityBase.EntityStatus = Entity.Estatus.Borrado;
this.listaBorrados.Add(entityBase);
List.Remove(entityBase);
}

/// <summary>
/// Quita el objeto IEntityBase con el objeto especificado
/// </summary>
/// <param name="entityBase">objeto IEntityBase a quitar</param>
public void RemoveElementOfList(IEntityBase entityBase)
{
List.Remove(entityBase);
}

/// <summary>
/// Inserta un objeto IEntityBase en la posicion especificada
/// </summary>
/// <param name="index">pocicion de la colección donde se va a insertar el objeto</param>
/// <param name="entityBase">cualquier clase heredada del IEntityBase</param>
public void Insert(int index, IEntityBase entityBase)
{
List.Insert(index, entityBase);
}

/// <summary>
/// Determina si la colección contiene una clase IEntityBase
/// </summary>
/// <param name="entityBase">cualquier clase heredada del IEntityBase</param>
/// <returns>bool</returns>
public bool Contains(IEntityBase entityBase)
{
return List.Contains(entityBase);
}

/// <summary>
/// Obtiene el objeto listaBorrados de la colección
/// </summary>
/// <returns>IColectionBase</returns>
public ICollectionBase GetDeleted()
{
if (listaBorrados == null)
{
listaBorrados = (ICollectionBase)Activator.CreateInstance(this.GetType());
}
return listaBorrados;
}
/// <summary>
/// Confirma todos los cambios realizados en la colección desde la ultima vez que se llamo AcceptChanges
/// </summary>
public void AcceptChanges()
{
foreach (Entity.IEntityBase elemento in this.List)
{
elemento.AcceptChanges();
}
if (this.listaBorrados != null)
{
this.listaBorrados.Clear();
}
}

/// <summary>
/// Obtiene un valor que indica si hay elementos eliminados dentro de la colección
/// </summary>
/// <returns>Regresa verdadero si existen elementos eliminados o de lo contrario falso</returns>
public bool HasDeleted()
{
return (this.listaBorrados != null && this.listaBorrados.Count > 0);
}

/// <summary>
/// Convierte la clase a un XML
/// </summary>
/// <returns>Cadena XML que representa a la clase</returns>
public string ToXml()
{
System.Text.StringBuilder stringBuilder=null;
try
{

System.Xml.Serialization.XmlSerializer serializador = new System.Xml.Serialization.XmlSerializer(this.GetType(),new XmlRootAttribute(this.GetType().ToString()));
stringBuilder = new System.Text.StringBuilder();
System.IO.StringWriter stringWriter = new System.IO.StringWriter(stringBuilder);
serializador.Serialize(stringWriter, this);
}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex.ToString() ,true);
}
return stringBuilder.ToString();
}

/// <summary>
/// Realiza una copia de la colleccion hacia un arreglo
/// </summary>
/// <param name="array">IEntityBase arreglo donde se dejara la informacion</param>
/// <param name="index">indice a partir de donde se va a copiar</param>
public void CopyTo(IEntityBase[] array, int index)
{
this.InnerList.CopyTo(array,index);
}

/// <summary>
/// Obtiene el indice del elemento especificado
/// </summary>
/// <param name="entidad">entidad a buscar</param>
/// <returns>int</returns>
public int IndexOf(IEntityBase entidad)
{
return this.InnerList.IndexOf(entidad);
}
}
}


Ir a parte III: Capa de Acceso a Datos (DAL)

<< Regresar al Indice del Artículo

Espacios de nombres usados en el código de este artículo:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;



Descargar Solución ArqSoft_Entity.zip
Area de Comentarios
Por Anónimo - Fecha: 2012/07/19 12:30 AM
i may not have considered this was cool a cpuloe years ago but yet its funny just how age varies the way you comprehend a mixture of creative ideas, many thanks regarding the piece of writing it is really pleasing to browse something clever once in a while in lieu of the routine crap mascarading as information sites on the internet, i'm off to play a cpuloe of hands of facebook poker, regards
Por Anónimo - Fecha: 2012/07/20 06:24 AM
GiKIUq , [url=http://loydrppwnkiv.com/]loydrppwnkiv[/url], [link=http://wvnjcuhmluuu.com/]wvnjcuhmluuu[/link], http://egfynclhapxf.com/
Por Anónimo - Fecha: 2012/07/20 10:31 PM
Salary increases paid in D-211 from 08-09Please pass this to evorneye you know in Schaumburg, Palatine & Hoffman Estates. If you want to get involved in this property tax issue call or write: D-211 School Board President Robert LeFevre (847-705-9067) (leave a message) Paying Drivers Ed teachers upwards of $154K and Librarians over $140K/yr is ludicrous. There is nothing responsible about this out of control freight train. If these salaries don’t cut you to the bone, to throw alcohol into our wounds, look at the year to year raises some of these teachers are receiving in this period of economic disaster. Most companies are scaling back, or at a minimum freezing salaries and bonuses, yet the D211 board finds no issue with abusive increases like this. Keep in mind this is two year old data. These raises were awarded at the peak of the economic downturn, there should not have been 1 cent of increase. I can’t wait to see the 2010 numbers. I intentionally listed position without name. Assignment Salary 09 Salary 08 Increase Rate Administration $211,021 $179,978 $31,043 17 Administration $173,199 $168,144 $5,055 3 Administration $166,689 $157,254 $9,435 6 Physical Education $162,490 $153,293 $9,197 6 Physics (Grades 9-12 Only) $162,418 $147,160 $15,258 10 Administration $158,122 $149,172 $8,950 6 Driver Education $154,270 $145,538 $8,732 6 Physical Education $153,158 $144,489 $8,669 6 Administration $152,413 $147,969 $4,444 3 Physical Education $151,555 $140,794 $10,761 8 Physical Education $151,195 $140,794 $10,401 7 Administration $150,540 $146,959 $3,581 2 Psychologist $147,780 $139,415 $8,365 6 Physical Education $147,618 $139,263 $8,355 6 Administration $147,174 $141,118 $6,056 4 Driver Education $147,116 $138,789 $8,327 6 Guidance Counselor $146,539 $138,245 $8,294 6 Librarian/Media Specialist $140,529 $136,627 $3,902 3 Totals $2,823,826 $2,655,001 $168,825
Por Anónimo - Fecha: 2012/07/21 12:43 PM
6n0GzV , [url=http://mhlhoiqisnhw.com/]mhlhoiqisnhw[/url], [link=http://ddveasfqidvx.com/]ddveasfqidvx[/link], http://cocxcbxdljyw.com/
Por Anónimo - Fecha: 2012/07/23 01:32 PM
85fQuj , [url=http://ykfigevhknpd.com/]ykfigevhknpd[/url], [link=http://lvjeikxiskix.com/]lvjeikxiskix[/link], http://oeanywugpspk.com/
Por Anónimo - Fecha: 2015/07/19 06:29 AM
Knocked my socks off with knglewdoe!
Por Anónimo - Fecha: 2015/12/17 03:06 PM
Firefox 3.5.3 Windows XPMy brother sugeestgd I would possibly like this website. He was once totally right. This publish truly made my day. You can not imagine simply how much time I had spent for this info! Thanks!
Por Anónimo - Fecha: 2015/12/17 03:07 PM
Great stffu, you helped me out so much!
Por Anónimo - Fecha: 2015/12/17 03:35 PM
Smart thinnikg - a clever way of looking at it.
Por Anónimo - Fecha: 2015/12/19 02:48 AM
What you posted was auatclly very reasonable. But, what about this? what if you wrote a catchier post title? I mean, I don't want to tell you how to run your website, but suppose you added a title that grabbed a person's attention? I mean Embedding Windows Media is a little boring. You could look at Yahoo's front page and watch how they write article headlines to get people to open the links. You might add a video or a pic or two to grab readers interested about everything've got to say. In my opinion, it could bring your posts a little bit more interesting. http://rbbmdovwe.com [url=http://eprbksrb.com]eprbksrb[/url] [link=http://eelzdoc.com]eelzdoc[/link]
Por Anónimo - Fecha: 2015/12/19 02:48 AM
efbbbfI rarely comnemt, but i did a few searching and wound up here Embedding Windows Media. And I actually do have 2 questions for you if you usually do not mind. Could it be only me or does it look like a few of these comnemts come across like they are written by brain dead people? And, if you are writing at other sites, I would like to follow everything new you have to post. Would you make a list of every one of your communal pages like your linkedin profile, Facebook page or twitter feed? http://wigffrmczw.com [url=http://rknqcis.com]rknqcis[/url] [link=http://mcfahaeu.com]mcfahaeu[/link]
Por Anónimo - Fecha: 2015/12/19 02:48 AM
What you wrote made a ton of sense. However, what about this? what if you were to create a kilelr headline? I am not saying your content is not good., however what if you added something to possibly grab a person's attention? I mean Embedding Windows Media is kinda plain. You ought to peek at Yahoo's front page and see how they create news titles to grab people interested. You might add a video or a pic or two to get readers interested about what you've got to say. Just my opinion, it would make your posts a little bit more interesting. http://dpiqzfqhr.com [url=http://zzqegvmjr.com]zzqegvmjr[/url] [link=http://esrwbcr.com]esrwbcr[/link]
Por Anónimo - Fecha: 2015/12/20 02:21 PM
efbbbfI usually do not drop many rkerams, however i did a few searching and wound up here Embedding Windows Media. And I actually do have 2 questions for you if it's allright. Is it just me or does it seem like a few of the rkerams come across like they are written by brain dead folks? And, if you are writing at other places, I would like to follow anything fresh you have to post. Could you list of the complete urls of all your public pages like your twitter feed, Facebook page or linkedin profile? http://plrfvls.com [url=http://xctfrliv.com]xctfrliv[/url] [link=http://nrpasm.com]nrpasm[/link]
Por Anónimo - Fecha: 2015/12/20 02:21 PM
I tend not to leave a leave a response, hoeevwr I read a great deal of remarks on this page Embedding Windows Media. I actually do have 2 questions for you if you tend not to mind. Is it simply me or does it appear like some of these comments appear like they are coming from brain dead individuals? And, if you are posting at other social sites, I'd like to keep up with everything new you have to post. Could you make a list of the complete urls of your social community sites like your Facebook page, twitter feed, or linkedin profile? http://hxdekldyzeg.com [url=http://shyfpmymid.com]shyfpmymid[/url] [link=http://xjuwlmrma.com]xjuwlmrma[/link]
Por Anónimo - Fecha: 2015/12/20 02:22 PM
I drop a comment wheenver I especially enjoy a post on a website or I have something to contribute to the conversation. Usually it is caused by the sincerness displayed in the article I read. And on this article Embedding Windows Media. I was actually excited enough to drop a thought I do have a couple of questions for you if you do not mind. Is it simply me or do some of the remarks look like coming from brain dead folks? And, if you are writing at other sites, I'd like to keep up with everything fresh you have to post. Could you make a list the complete urls of your social pages like your twitter feed, Facebook page or linkedin profile? http://oacstyw.com [url=http://qcpfmoln.com]qcpfmoln[/url] [link=http://bhfqgvz.com]bhfqgvz[/link]
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ricardo leppe t
pedrojavier
CALIN
willipinru
richard
ragomez
PER 238
MEX 236
CRI 188
COL 118
ESP 105
ARG 88