Patron Proxy en C#
Este es un ejemplo del Patron Proxy adaptado x mí, lo traté de hacer lo suficientemente claro para que no requiera mucha explicación, pero…basicamente es:Empleado deriva de IPersona.
Defino los metodos de Empleado (que son los metodos reales)
Despues defino el Proxy que tambien deriva de IPersona, de modo que aun no estando instanciado realmente en memoria, puedo ocupar los metodos, de manera que retraso la instanciación (que es una de las motivaciones de este patron).
Cuando deseo ocupar los metodos de Empleado, no lo trato directamente con él, sino con su delegado, es decir, el Proxy.
//
// Ejemplo Utilizando el patron Proxy
//
using System;
namespace sampleProxy3
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
IPersona obj = new Proxy();
obj.PonerNombre("dario"); //este es el momento en que se crea
verdaderamente el objeto pero ya puedo
ocupar sus metodos.
obj.Imprimir();
Console.ReadLine();
}
}
public interface IPersona
{
string ObtenerNombre ();
void PonerNombre (string nombre);
void Imprimir();
}
public class Empleado : IPersona
{
string Nombre;
public Empleado(string nombre)
{
this.Nombre = nombre;
}
public Empleado(){}
#region Miembros de IPersona
public string ObtenerNombre()
{
return this.Nombre;
}
public void PonerNombre(string nombre)
{
this.Nombre = nombre;
}
public void Imprimir()
{
Console.WriteLine("El nombre es: "+this.Nombre);
}
#endregion
}
public class Proxy : IPersona
{
Empleado emp;
public void PonerNombre(string nombre)
{
if (emp == null)
{
emp = new Empleado();
}
emp.PonerNombre(nombre);
}
public void Imprimir()
{
if (emp == null)
{
emp = new Empleado();
}
emp.Imprimir();
}
public string ObtenerNombre()
{
if (emp == null)
{
emp = new Empleado();
}
return emp.ObtenerNombre();
}
}
}
Un ejemplo de esto más tangible, es lo que hace el Visual Studio cuando se Agrega una Referencia Web -un Web Service-. Como vamos a necesitar ocupar los metodos del Web Service que lo tenemos en otra parte del mundo, primero te genera un proxy para que vos puedas interactuar con los metodos de las clases originales, sin interactuar con el objeto instanciado. De modo que el Intellisense nos deja ver todo lo que tiene para ofrecernos el Web Service.
ORM Industria Argentina
Leyendo un poco el mail de las listas del MUG (Grupo de Usuarios de Microsoft) descubri un Framework de Persistencia de Objetos para Punto Net, Retina.Net, y estuve mirando algunos ejemplos, y está un chiche!!! Actualmente está hosteado en GoDotNet, e incluye el source y un quickstart que esta muy bueno para comenzar a mapear objetos, donde te muestra en lo que pude ver, como crear tablas, triggers, y como crear una factura y sus lineas, y despues las mappea a todas juntas como parte de la misma factura, la verdad una maravilla !!!
Es increible el trabajo que hizo Andres Vettori, está escrito en C# y aparentemente según lo que dijo lo está migrando al framework 2.0
Con un ritmo constante, Andrés, va realizando actualizaciones, y corrigiendo errorcillos, y agregandoles cosas nuevas.
Actualmente está en la versión 1.0.7 y sería muy interesante probarlo, usarlo y por sobre todo acercar los comentarios a este hombre que con humildad está dispuesto a escuchar.Estuve viendo a Retina y tratando de entender su operatoria y la verdad que vale la pena probarlo. Segun lo que ví mapea por medio de atributos, y no por medio de Xml como el NHibernate, pero no creo que esto sea una complicación, la cuestión es que mapea y lo hace bien.
What ???!!!
Vean lo que es este trozo de codigo, y me parece que habla por si solo. Si… es lo que Uds piensan…es LINQ, Language INtegrated Query.. que te permite hacer consultas en pleno
C# y VB, y no solamente a bases de datos, podes hacerlo como muestra el primer ejemplo, a un simple arreglo.
using System;
using System.Query;
using Danielfe;
class Program
{
static void Main(string[] args)
{
string[] aBunchOfWords = {"One","Two", "Hello",
"World", "Four", "Five"};
var result =
from s in aBunchOfWords // query the string array
where s.Length == 5 // for all words with length = 5
select s; // and return the string
//PrintToConsole is an Extension method that prints the value
result.Print();
}
}
y para que lo vean como funcionaría con un SQL Server, va un ejemplo, y me parece que no hace falta explicarlo
using System;
using System.Query;
using Danielfe;
using System.Data.DLinq; //DLinq is LINQ for Databases
using nwind; //Custom namespace that is tool generated
class Program
{
static void Main(string[] args)
{
Northwind db = new Northwind("Data Source=(local);Initial Catalog=Northwind;Integrated Security=True");
TableCustomers> allCustomers = db.GetTableCustomers>();
var result =
from c in allCustomers
where c.ContactTitle.Length == 5
select c.ContactName;
result.Print();
}
}
NHibernate y .NET 2.0
En estos dias migré el Trabajo de Cliente Servidor que lo tenía realizado en un Visual Studio 2003 Professional, al tan esperado Visual Studio 2005 (Developer).
El Wizard para importar proyectos de versiones anteriores se portó bastante bien (bueno en algunos casos hizo cualquier cosa pero bueno), por lo menos sirvió para presentar de nuevo el trabajo con algunas mejoras, en realidad el cambio surgió que tenía que hacer unos reportes a partir de un Dataset, con el Crystal Report, pero al parecer estaba pinchado, y no funcionaba bien, aparte de unos STOPs Windows XP al querer compilar muchos proyectos de una Solución, que incluso no me dejaban compilar el Enterprise Library 2005.
Bueno entonces lo pasé a un 2003 Server y donde tenía el VS 2005 y funcionó.
Salvo con algunas problemas con las vistas de Diseño.
Pero lo mas asombroso fue que funcionó el mapper de Objetos, o sea el NHibernate 1.0 !!!… una maravilla y no tuve que hacer nada respecto a eso. Segun estuve leyendo hay ciertas cosas que no son compatibles…habria que esperar una nueva version que sea totalmente compatible con ADO.NET 2.0. Este es un link a un blog que habla un poco sobre el soporte de null con el NHibernateContrib