Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

martes, 3 de noviembre de 2015

Patrón Factoría de métodos en .net

Un patrón factoría nos sirve para canalizar todas las creaciones de objetos en un solo punto. Esto es útil para un diseño robusto de nuestro sistema y ágil al cambio.
El patrón factoría se puede combinar con el patrón singleton ya que es más cómodo su uso y útil su forma de usar. En este ejemplo pondremos un factoría sin singleton.
Decir que el patrón factoría es del tipo patrones creacionales, que este tipo de patrón abstrae la forma de crear objetos concretos, dando así un soporte para crear objetos de forma abstracta.
Para empezar un patrón factoría debe cumplir:
– Una función o método el cual se encarga de crear objetos de un tipo dado.
– No es obligatorio pero si recomendable que dicha función o método devuelva una abstracción (interfaz o clase abstracta).
Imaginemos que una tienda de pizzas requiere de un software que necesita que tengan una serie de productos (pizzas variadas). Como buenos diseñadores que somos, la creación de objetos de pizzas se podrá hacer desde cualquier parte el proyecto, pero el problema es que hay muchos tipos de pizzas. El crear cada pizza de cada tipo en distintos puntos del programa sería lo primero que pensaríamos, pero… ¿si en vez de eso usamos sentido común y aplicamos el factoría?, esto nos permitiría que dado un nuevo producto o un cambio en alguno de ellos, que solo cambiemos en un solo lugar, teniendo más controlado dicho código. Incluso si os dais cuenta la agilidad al cambio es mucho mayor que ir cambiando todas las posibles apariciones de nuestras pizzas por el código.
Pues bien, el factoría se encargaría de crear todo tipo de pizzas y las ofrecería a todos los posibles puntos del programa.
Nuestro ejemplo sería el siguiente:
– La interfaz IPizza:
    interface IPizza
    {
        void quienSoy();
    }
– Las pizzas concretas:
    public class PizzaBarbacoa: IPizza
    {
        #region Miembros de IPizza

        public void quienSoy()
        {
            Console.WriteLine("Soy una pizza de Barbacoa");
        }

        #endregion
    }
    public class PizzaMargarita: IPizza
    {
        #region Miembros de IPizza

        public void quienSoy()
        {
            Console.WriteLine("Soy una pizza de Margarita");
        }

        #endregion
    }
    public class PizzaPepperoni: IPizza
    {
        #region Miembros de IPizza

        public void quienSoy()
        {
            Console.WriteLine("Soy una pizza de Pepperoni");
        }

        #endregion
    }
– La factoría en cuestión:
    public class PizzaFactory
    {
        public enum tipoPizza
        {
            Pepperoni,Margarita,Barbacoa
        }

        public IPizza getPizza(tipoPizza tipo)
        {
            switch (tipo)
            {
                case tipoPizza.Barbacoa:
                    return new PizzaBarbacoa();
                    break;
                case tipoPizza.Margarita:
                    return new PizzaMargarita();
                    break;
                case tipoPizza.Pepperoni:
                    return new PizzaPepperoni();
                    break;
                default:
                    return new PizzaBarbacoa();
            }
        }
    }
– Un pequeño test:
    public class Test
    {
        public void testPizza()
        { 
            //ejemplo no usando factoría
            IPizza pizza1 = new PizzaBarbacoa();
            pizza1.quienSoy();
            IPizza pizza2 = new PizzaMargarita();
            pizza2.quienSoy();
            IPizza pizza3 = new PizzaPepperoni();
            pizza3.quienSoy();
            IPizza pizza4 = new PizzaBarbacoa();
            pizza4.quienSoy();
            IPizza pizza5 = new PizzaMargarita();
            pizza5.quienSoy();

            //ejemplo usando factoría
            PizzaFactory factory = new PizzaFactory();
            IPizza pizza6 = factory.getPizza(PizzaFactory.tipoPizza.Barbacoa);
            pizza6.quienSoy();
            IPizza pizza7 = factory.getPizza(PizzaFactory.tipoPizza.Margarita);
            pizza7.quienSoy();
            IPizza pizza8 = factory.getPizza(PizzaFactory.tipoPizza.Pepperoni);
            pizza8.quienSoy();
        }
    }
Como veis la forma de uso y sus ventajas son mejores. Espero que os sirva!!. Hasta luego!



Fuentes:

http://jorge.queideas.com/index.php/2010/08/27/patron-factoria/

http://elcodigoyyo.blogspot.com.co/2010/01/factoria-abstracta-en-acceso-datos-con.html

https://lalejogg.wordpress.com/2011/06/24/arquitectura-%E2%80%93-patrones-%E2%80%93-factory-factoria-o-fabrica-%E2%80%93-codigo-c/

miércoles, 26 de agosto de 2015

Encrypt your passwords with SHA1 hashing in C#


In this post I will be showing a simple C# method that can be used to encrypt a string(password) to SHA1 hash 

SHA-1 is a cryptographic hash function designed by the United States National Security Agency and is a U.S. Federal Information Processing Standard published by the United States NIST.
SHA-1 produces a 160-bit (20-byte) hash value. A SHA-1 hash value is typically rendered as a hexadecimal number, 40 digits long. (From Wikipedia)


To use the SHA1 encryption in your application you should include the <System.Security.Cryptography> Namespace using the code above

 using System.Security.Cryptography;  

The Bloc code below carries a method (GetSHA1) that convert a chain to an MD5 hash, returning a 40 characters, white one string parameter

GetSHA1 function :

  public string GetSHA1(string text)  
     {  
       SHA1CryptoServiceProvider sh = new SHA1CryptoServiceProvider();  
       sh.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text));  
       byte[] re = sh.Hash;  
       StringBuilder sb = new StringBuilder();  
       foreach (byte b in re)  
       {  
         sb.Append(b.ToString("x2"));  
       }  
       return sb.ToString();  
     }  

To use the GetSHA1 method

  string result = = GetSHA1("Net4free");  
             SHA1 hash for Net4free is : 4bb74e9a18cc22abe08a92b29bfba04bf870728d




Download

Fuente: http://www.tuto4free.com/2014/04/encrypt-your-passwords-with-sha1.html

Encrypt your passwords with MD5 hashing in C#

In this blog post I will be demonstrating a simple C# method that can be utilized to encrypt a string (password) to MD5 hash



The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity. (From Wikipedia)




To use the MD5 encryption in your application you should include the <System.Security.Cryptography> Namespace using the code above


 using System.Security.Cryptography;  

The Bloc code below carries a method (GetMD5) that convert a chain to an MD5 hash, returning a 32 characters, white one string parameter
GetMD5 function

  public string GetMD5(string text)  
     {  
       MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
       md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text));  
       byte[] result = md5.Hash;  
       StringBuilder str = new StringBuilder();  
       for (int i = 0; i < result.Length; i++)  
       {  
         str.Append(result[i].ToString("x2"));  
       }  
       return str.ToString();  
     }  

To use the GetMD5 method

 string result = GetMD5("Net4free");  
      MD5 hash for Net4free is : 52db46c9e0d26245d5d24c38c6517a91




Download

Fuente: http://www.tuto4free.com/2014/04/encrypt-your-passwords-with-md5-hashing.html

viernes, 7 de agosto de 2015

Detectar Usuario y Nombre de Dominio

Buenas noches.

Desde C# podemos averiguar fácilmente el usuario (login) y nombre del dominio. Esto normalmente lo usamos cuando integramos aplicaciones con el sistema operativo o tenemos curiosidad de interactuar con el :)

Podemos crear un botón que invoque las funciones del sistema y asignar los valores a dos label que creamos:

Private void btnUsuarioDominio_Click(object sender, EventArgs e)

{
         Label1.Text = SystemInformation.UserName;
         Label2.Text = SystemInformation.UserDomainName;
}


Con esto ya tenemos la información que necesitábamos

Saludos

Fuente: https://underc0de.org/foro/visual-studio-net/%28c%29-detectar-usuario-y-nombre-de-dominio/


lunes, 1 de junio de 2015

Mas trabajos sobre fechas

Buenos días

El día de hoy me encontraba con el dilema de calcular a partir de una fecha calcular el mes y la semana en que se encontraba. Una tarea que a simple vista tendría muchas soluciones tantos manuales como automáticas y la idea es hacerla lo menos costosa posible.

Navegando en la red me encontré las siguientes soluciones:

Calcular la semana en que estamos: Mi necesidad no era simplemente conocer el número de la semana en que se encuentra la fecha sino también extraer los días que se encuentran durante esa fecha para esta tarea es lógico que debemos conocer el primer y ultimo día de la semana, para esta tarea la solución mas corta que encontré fue la siguiente:

var date = DateTime.Today;

var first = date.AddDays(-1 * ((int)DateTime.Now.DayOfWeek - 1));
var last = first.AddDays(7).AddMilliseconds(-1);



Ya conocemos el primer y ultimo dia de la semana, ahora necesitamos el primer y ultimo dia del mes:


DateTime fechatemp = DateTime.Today;

DateTime fecha1 = new DateTime(fechatemp.Year, fechatemp.Month, 1);
DateTime fecha2;

if (fechatemp.Month + 1 < 13)
{ fecha2 = new DateTime(fechatemp.Year, fechatemp.Month + 1, 1).AddDays(-1); }
else
{ fecha2 = new DateTime(fechatemp.Year + 1, 1, 1).AddDays(-1); }






Fuentes:
http://elmapacheprogramador.blogspot.com/2015/01/obtener-el-lunes-y-domingo-de-la-semana-de-una-fecha-dada-en-csharp.html -->Fuente del domingo
http://www.jpozo.net/2011/10/como-saber-la-fecha-del-lunes-de-la.html --> Fuente del lunes
http://recuerdaprogramacionrapido.blogspot.com/2010/08/dateadd-sumar-valores-dias-meses-o-anos.html
http://www.cjorellana.net/2011/02/primer-y-ultimo-dia-de-mes-c.html --> Fuente del primer y ultimo día del mes
https://social.msdn.microsoft.com/Forums/es-ES/b5fb0faf-eec3-43a0-94da-b2224915996e/convertir-el-numero-de-semana-en-fecha?forum=vbes
https://social.msdn.microsoft.com/Forums/es-ES/8810e7ba-acc4-457b-830a-d17066149527/obtener-fecha-inicial-y-final-del-mes?forum=vcses


viernes, 29 de mayo de 2015

Desarrollar en c# sin pagar licencia

Buenos días.

Anteriormente existía esta solución: http://www.icsharpcode.net/OpenSource/SD/
para desarrollar en csharp de forma gratuita sin tener que pagar licencias de uso a microsoft, durante este año ellos lanzaron una solución gratuita para trabajar en .net.

Queda de mirar cual solución es más cómoda, personalmente no he usado ninguna de las dos así que no podría opinar al respecto adecuadamente.

martes, 19 de mayo de 2015

Como comenzar un proyecto con NHibernate en C#. Ejemplo práctico (PostgreSQL)

Los dejo con esta buena entrada del blog de José, la base es la misma para cualquier bd próximamente subiré una usando oracle.

Desde hace unos días que me toca lidiar con C# para un desarrollo de escritorio y estamos comenzando con ello. Durante el desarrollo queremos usar NHibernate con Persistence ya que simplifica enormemente el uso de bases de datos y en otros proyectos lo he empleado extensivamente, aunque siempre con Java.
Antes de entrar en materia, para aquellos que no tengan experiencia previa en NHibernate les recomiendo leer estas dos entradas (esta y esta) para conocer un poco sobre su funcionamiento. 
Lo que voy a hacer es un ejemplo muy básico, empleando una clase que llamaremos Empleado.cs con varios atributos de tipo string. Además mapearé la clase con un fichero empleado.hbm.xml. Como base de datos usaré PostgreSQL sobre Windows. Podéis consultar en esta entrada del blog como instalarlo y ponerlo en marcha.
Lo primero de todo es la creación del proyecto con Visual Studio 2012. Para ello en File-New Project vamos a elegir Windows Form Application y le llamaremos Ejemplo:
 
Vamos primero a añadir los paquetes que necesitamos para usar NHibernate. Para ello haciendo click con el botón derecho sobre las References de nuestro proyecto, abriremos el Manage NuGet Packages.
Buscamos NHibernate y lo instalamos. Empleando el NuGet nos ahorramos tener que bajarnos las librerías y agregarlas al proyecto, haciéndolo NuGet por nosotros.
 
Además necesitamos el driver de PosgreSQL de igual forma que hicimos con NHibernate. Para ello instalaremos el paquete Npgsql.
 
 Ahora vamos a crearnos nuestra primera clase que llamaremos Entity. Para ello vamos a crearnos una carpeta y situaremos la clase en su interior. 
Nos crearemos esta clase con el fin de que todas las clases que nos crearemos extiendan de esta y así tener unos parámetros comunes. Estos parámetros no son más que el Id y la Versión. El contenido de esta clase será:  
namespace Ejemplo.Entities
{
    public abstract class Entity<TId>
    {
        public virtual TId Id { get; protected set; }
        protected virtual int Version { get; set; }

        public override bool Equals(object obj)
        {
            return Equals(obj as Entity<TId>);
        }

        private static bool IsTransient(Entity<TId> obj)
        {
            return obj != null &&
                   Equals(obj.Id, default(TId));
        }

        private Type GetUnproxiedType()
        {
            return GetType();
        }

        public virtual bool Equals(Entity<TId> other)
        {
            if (other == null)
                return false;
            if (ReferenceEquals(this, other))
                return true;
            if (!IsTransient(this) &&
                !IsTransient(other) &&
                Equals(Id, other.Id))
            {
                var otherType = other.GetUnproxiedType();
                var thisType = GetUnproxiedType();
  return thisType.IsAssignableFrom(otherType) ||
   otherType.IsAssignableFrom(thisType);           }
            return false;
        }

        public override int GetHashCode()
        {
            if (Equals(Id, default(TId)))
                return base.GetHashCode();
            return Id.GetHashCode();
        }
    }
    public abstract class Entity : Entity<Guid>
    {  }
}
Una vez que hemos hecho esto ya podemos crearnos nuestra entity Empleado.cs. A esta clase le vamos a meter cuatro atributos tipo string muy sencilllos:
namespace Ejemplo.Entities
{
    class Empleado : Entity
    {
        public virtual string Nombre { get; set; }
        public virtual string Direccion { get; set; }
        public virtual string Telefono { get; set; }
        public virtual string Fax { get; set; }

    }
}
Ahora tenemos que crearnos el fichero de mapeo de estas clases. Se tiene que llamar Empleado.hbm.xml y con el siguiente contenido:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Ejemplo"
    namespace="Ejemplo.Entities">
  <class name="Empleado">
    <id name="Id">
      <generator class="guid.comb" />
    </id>
    <natural-id mutable="true">
      <property name="Nombre" not-null="true" />
    </natural-id>
    <version name="Version" />
    <property name="Direccion" />
    <property name="Telefono" />
    <property name="Fax" />
  </class>
</hibernate-mapping>
Si nos fijamos en el código anterior, vemos como como hemos mapeado con una etiqueta del tipo property cada uno de los atributos de la clase. Además nos fijaremos en como se define la clave primaria con el atributo generator y como seleccionamos el nombre como natural-id.
Debemos de tener en cuenta que en las propiedades de este archivo se ha de cambiar el "Build Action" a Embedded Resource.
Una vez que hemos hecho esto nos crearemos el fichero de conexión con la base de datos. Este fichero se tiene que llamar de forma obligatoria Hibernate.cfg.xml. Como hemos dicho, vamos a usar la conexión con PostgreSQL por lo que su contenido debe de ser el siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class"> NHibernate.Driver.NpgsqlDriver </property>
<property name="connection.connection_string">
 Server=localhost; Database=database; User ID=postgres; Password=password;</property>

<property name="dialect">NHibernate.Dialect.PostgreSQL82Dialect </property>
 <mapping assembly="Empleado"/>
  </session-factory>
</hibernate-configuration>
Vemos como hemos indicado en el connection_string los parámetros de conexión con nuestra base de datos, estos deben de ser cambiados en función de nuestra configuración. Además debemos de cambiar en las propiedades del archivo el Copy to Output Directory de "Do not copy" a "Copy if never"
 

Ahora vamos a modificar el formulario añadiendo 4 Label con 4 TextBox. En cada uno de los EditText vamos a recoger los parámetros para la creación de un nuevo empleado cuando se pulse un botón. Además nos crearemos otro botón para leer los empleados que hayamos introducido. El aspecto que tendrá nuestro formulario será el siguiente:
Dentro de evento click de Crear Empleado tenemos que crearnos un objeto de la clase Empleado y almacenarlo en la base de datos. Para ello usaremos el siguiente código: 
private void buttonCrearEmpleado_Click(object sender, EventArgs e)
 {
     Empleado empleado = new Empleado()
     {
         Nombre = textBoxNombre.Text.ToString(),
         Direccion = textBoxDireccion.Text.ToString(),
         Telefono = textBoxTelefono.Text.ToString(),
         Fax = textBoxFax.Text.ToString()
     };

   var hibernateConfiguration = new Configuration().Configure();
 var sessionFactory = hibernateConfiguration.BuildSessionFactory();
   var session = sessionFactory.OpenSession();
   var tx = session.BeginTransaction();
   session.Save(empleado);
   tx.Commit();
}
Si repasamos el código anterior vemos como una vez creado el objeto Empleado nos creamos un sessionFactory, abrimos la conexión con OpenSession, después BeginTransaction, hacemos un Save del objeto y ya solamente nos queda el Commit para que los cambios se realicen en ese mismo momento.
Una vez que ya tenemos implementados el método para guardar en base de datos nuestros empleados nos falta el método para leerlos. Para ello en el evento click del botón leer tenemos que escribir lo siguiente: private void buttonLeerEmpleados_Click(object sender, EventArgs e)
{
    var nhConfig = new Configuration().Configure();
    var sessionFactory = nhConfig.BuildSessionFactory();
    var session = sessionFactory.OpenSession();
    var tx = session.BeginTransaction();
    var empleados = GetEmpleados(session);
    foreach (Empleado empleado in empleados)
    {
    Console.WriteLine(empleado.Nombre + " " + empleado.Direccion
    + " " + empleado.Telefono + " " + empleado.Fax + "\n");
    }}

   static IList<Empleado> GetEmpleados(ISession session)
   {
      var query = session.CreateCriteria<Empleado>()
        .AddOrder(Order.Asc("Nombre"));
       return query.List<Empleado>();
   }
Si repasamos el código, vemos que es similar al anterior, tenemos que abrir la conexión, luego BeginTransaction y llamamos al método GetEmpleados que nos hemos implementado abajo. Este método mediante un Criteria nos traemos todos los empleados y los devolvemos en una lista. Esta lista la recorremos para imprimir en consola cada uno de los empleados. Por último, debemos de añadir lo siguiente en la clase Program.cs justo después del Main.
try
{
 var hibernateConfiguration = new Configuration().Configure();
 var sessionFactory = hibernateConfiguration.BuildSessionFactory();
 var schemaExport = new SchemaExport(hibernateConfiguration);
schemaExport.Create(false, true);
}
catch (Exception err)
{   }
Lo que estamos haciendo con este código es la creación directamente de las tablas que necesitamos en nuestra base de datos. Esta característica nos permite olvidarnos de nuestra base base de datos, crearnos nuestro modelo mediante los archivos de mapeo .xml y crear todas las tablas necesarias. Tenemos que tener en cuenta que cada vez que se abra la aplicación se van a borrar las tablas que existían y se crearán nuevas por lo que perderemos lo que existe. Por lo tanto debemos de borrar estas líneas una vez que tengamos el modelo de datos creado.
Si creamos un nuevo elemento tal y como vemos en la imagen siguiente y le hacemos click en el botón crear empleado:
 
Si abrimos pgAdminIII veremos como se ha creado la tabla y tenemos el registro en su interior. 
Si ahora pulsamos el botón de leer empleados veremos en la consola los empleados que hemos creado, en este caso solamente uno.

Esto sería una primera aproximación al uso de NHibernate con PostgreSQL. Iré añadiendo más tutoriales a medida que avance. Todo lo relacionado con este tipo de desarrollos lo puedes encontrar en la siguiente página del blog (aquí)
Espero que os sirva y si tenéis cualquier duda o problema emplear los comentarios para preguntar.

Código fuente: https://github.com/josealopezpastor/NHibernate-Example#sthash.MNRyVAIL.dpuf
Fuente: http://www.josealopezpastor.com/2013/04/how-to-como-comenzar-un-proyecto-con_23.html

Otras fuentes:
http://www.palentino.es/blog/nhibernate-mi-primera-aplicacion-orm-caso-practico/
http://blog.farmerdev.com/?p=11
http://jhernandz.es/noticia/usar-nhibernate-con-fluentnhibernate