martes, 30 de junio de 2015

Pasando de ASP.NET WebForm a ASP.NET MVC

Buenos días

Este post que encontré en el blog de asp.net en español me gusto mucho, es algo antiguo pero sirve para los que apenas estamos mirando el mundo del mvc.

Si eres un desarrollador acostumbrado a ASP.NET WebForm y estas comenzando con el patrón MVC (ASP.NET MVC) deberías leer este articulo.

MVC en Imagen

image

Equivalencias entre WebForm y MVC

WebFormMVC
MasterPage_Layout.cshtml (Se encuentra en Views\Shared)

@{
       Layout = "~/Views/Shared/_Layout.cshtml";
       ViewBag.Title = "Dashboard";
}
User Controls
.ascx
Vistas Parciales (forzando la ejecución del controlador)
Existen diferencias importantes:
  • Cuando incluimos vistas compartidas en otra vista, esta son interpretadas por razor sin ejecutarse ningún controlador. Simplemente se renderiza su contenido – no como en los controles ascx donde se ejecuta todo el ciclo de vida del control completo y sus correspondientes eventos
@Html.Partial(“_PartialFooter”);
@Html.Partial(MVC.Shared.Views._PartialFooter);
  • Es posible utilizar una vistas compartida de un modo muy similar al de un control ascx de ASP.NET WebForms, aunque para este debemos forzar la ejecución del controlador a través de los métodos Action y RenderAction del Helper Html:
[ChildActionOnly]
public virtual ActionResult MenuBar(stringselectedId)
{
       MenuModel menu = new MenuModel(selectedId);
       return PartialView(menu);
}
@Html.Action("MenuBar")
@Html.Action(MVC.Home.MenuBar())
             *Ejecuta el método "MenuBar" del controlador correspondiente


 


Aspectos que no existen en MVC


En ASP.NET MVC desaparecen algunos conceptos que eran muy utilizados en WebForm y que nos obligaran a cambiar el chip:


  • No hay ViewState

  • No hay Eventos

  • No hay PostBack



Paquetes utilizados:


Fuente: http://www.esasp.net/2012/10/pasando-de-aspnet-webform-aspnet-mvc.html

Unir 2 tablas usando linq y claves compuestas

Buenos días.

Básicamente lo que necesitaba era unir dos listas, en ambas podía referenciarlas por dos valores, por lo cual era necesario crear una tabla nueva con los valores unidos.

Este post lo partiré con respecto a lo encontrado en internet y en la parte final colocare la forma como me ha funcionado.

Primer referencia encontrada:

Haciendo una consulta Linq con Entity Framework, he encontrado un problemilla que me ha costado algo de tiempo solucionarlo, y creo que era digno merecedor de una entrada en el blog.

Estaba haciendo una consulta join a 2 tablas con clave compuesta.

var listaCentro = from f in ctx.Facturas
join c in ctx.CentroCoste
on new { f.empresa, f.centroCoste } equals new { c.empresa, c.centro}
select new {c.empresa, c.nombre};

y me aparecía el siguiente error:

“El tipo de una de las expresiones de la cláusula join es incorrecto. No se pudo inferir el tipo en la llamada a 'Join'”

El MSDN me sugería que verificara los tipos del join, comprobando que fueran del mismo tipo las parejas f.empresa, c.empresa y f.centroCoste, c.centro.

Comprobado esto, seguí buscando y me encontré con la siguiente frase:

“La inferencia de tipos en claves compuestas depende de los nombres de las propiedades en las claves y del orden en el que ocurren”

Las claves f.empresa coinciden con c.empresa, pero f.centroCoste no coincide con c.centro, y debían de coincidir.

La solución estaba en poner nombre a las propiedades de las clases anónimas que usamos para las claves compuestas.

var listaCentro = from f in ctx.Facturas
join c in ctx.CentroCoste
on new { emp = f.empresa, centro = f.centroCoste } equals new { emp = c.empresa,centro = c.centro}
select new {c.empresa, c.nombre};

Enlace al artículo MSDN que habla sobrer las claves compuestas:
http://msdn.microsoft.com/es-es/library/bb907099.aspx




Segunda referencia encontrada:

var query = from p in context.T1

        join q in context.T2

        on

        new { p.Col1, p.Col2 }

        equals

         new { q.Col1, q.Col2 }

        select new {p...., q......};

Solución Propia:

                            var Tablanueva = (from i in Item
                                                        join u in Usuario
                                                        on i.Servicio
                                                        .Id equals u.IdServicio
                                                        where
                                                            i.Id == u.IdItem
                                                        select new
                                                        {
                                                            u.IdItem,
                                                            u.Dia,
                                                            u.IdServicio,
                                                            i.FechaInicio,
                                                            u.Login,
                                                            i.Valor 
                                                        }
                                                         ).ToList();



Fuentes:

Primer referencia: http://www.overflowexception.es/2011/08/unir-2-tablas-usando-linq-y-claves.html
Segunda referencia:  http://stackoverflow.com/questions/373541/how-to-do-joins-in-linq-on-multiple-fields-in-single-join

Extras:
http://www.esasp.net/2010/02/linq-distinct-except-intersect-union.html
http://stackoverflow.com/questions/5307731/linq-to-sql-multiple-joins-on-multiple-columns-is-this-possible
http://www.esasp.net/2010/02/left-join-linq.html
https://danielggarcia.wordpress.com/2013/11/21/sentencias-en-linq-iii-agrupaciones-group-by/
http://kartones.net/blogs/sector7g/sintaxis-linq-union-intersect-y-except.aspx

sábado, 27 de junio de 2015

patrón de diseño Factory Method

Una factoría es un objeto que maneja la creación de otros objetos. Las factorías se utilizan cuando la creación de un objeto implica algo más que una simple instanciación.
Los siguientes ejemplos son casos donde una factoría puede ayudar:
  • Es necesario acceder a algún recurso para la creación y configuración de un objeto.
  • No conocemos hasta el momento preciso de la instanciación qué tipo concreto de objeto se va a instanciar.

En estos casos, en lugar de que sea el propio objeto quien se encargue de todos los aspectos realativos a la creación, se crea otro objeto que lo haga. De esta manera, se libera al objeto que va a ser creado de aquellas responsabilidades que no le corresponden pero que son necesarias para su creación, manteniendo su independencia.

El siguiente es un ejemplo de la utilización de una factoría para la creación de objetos. Se pueden crear figuras geométricas y calcular su área. Las figuras estarían definidas por una interfaz. Las figuras posibles son círculos y cuadrados.

Se va a utilizar una factoría para crear las figuras, puesto que no conocemos de antemano a qué clase pertenece el objetoque tenemos que instanciar. El uso de una factoría permite separar la lógica de negocio, igual para todos los casos, de la lógica de instanciación de los objetos. De este forma el código queda más claro.
public interface Figura {
 public double getArea();
}

public class Circulo implements Figura {
 double radio;
 
 public Circulo(double radio) {
  this.radio = radio;
 }
 
 public double getArea() {
  return (3.14 * radio * radio);
 }
}

public class Cuadrado implements Figura {
 double lado;
 
 public Cuadrado(double lado) {
  this.lado = lado;
 }
 
 public double getArea() {
  return lado * lado;
 }
}

public class Principal {
 public static void main(String[] args) {
  int tipo = Integer.parseInt(args[0]);
  double lado = Double.parseDouble(args[0]);  
 
  Figura figura = 
   FiguraFactory.getFigura(tipo, lado);

  System.out.println("El area de la figura es: " + figura.getArea());
 }
}

public class FiguraFactory {
 public final static int CUADRADO = 0;
 public final static int CIRCULO = 1;
 
 public static Figura getFigura(int tipo, double lado) {
  switch (tipo) {
   case CUADRADO:
    return new Cuadrado(lado);
   case CIRCULO:
    return new Circulo(lado);
  }  
  return null;
 }
}


  • Factory Method (Medido Factoría):
– Básicamente se crea una interfaz que es la que referencia los nuevos objetos que se van a crear, luego se generan las respectivas subclases que son las encargadas de crear los objetos y que van a ser llamadas por la clase principal.
He aquí el ejemplo:


using System;

namespace Method_Factory
{
    public enum tipoEmpleado
    {
        operario,
        coordinador
    }

    //Consumiendo los Factory
    class MethodFactory
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Salario : " + FactorySalarios.getSalario(tipoEmpleado.operario, 55).ToString());
            Console.ReadLine();
        }
    }

    // Esta es la clase Base
    public abstract class Persona
    {
        public virtual double CalcularSalario(int horasLaboradas)
        {
            return 0;
        }

    }

    // Aqui van las clases derivadas
    public class operario : Persona
    {
        public override double CalcularSalario(int horasLaboradas)
        {
            return 1000 * horasLaboradas;
        }
    }

    public class coordinador : Persona
    {
        public override double CalcularSalario(int horasLaboradas)
        {
            return 2000 * horasLaboradas;
        }
    }

    // Aqui va la clase Factory por fin!!
    public static class FactorySalarios
    {
        public static Nullable<double> getSalario(tipoEmpleado Empleado, int HorasLaboradas)
        {
            if (Empleado == tipoEmpleado.operario)
            {
                return new operario().CalcularSalario(HorasLaboradas);
            }
            else if (Empleado == tipoEmpleado.coordinador)
            {
                return new coordinador().CalcularSalario(HorasLaboradas);
            }
            else
            {
                return null;
            }
        }
    }
}



El ejemplo anterior se corresponde con el patrón de diseño Factory Method, que se refiere a la utiliación de un método cuyo propósito principal es la creación de objetos.


Fuente:
http://tratandodeentenderlo.blogspot.com/2010/02/patrones-de-diseno-factorias.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/

Extras:
https://msdn.microsoft.com/es-es/library/bb972258.aspx#M12
http://es.slideshare.net/jonathancalero/mtodo-fabrica-method-factory-10275431
http://www.dofactory.com/net/factory-method-design-pattern --Completo
https://sourcemaking.com/design_patterns/factory_method/c-sharp-dot-net
https://www.youtube.com/watch?v=HNJVdj361KY --Completo


Encoding Strings to Base64 in C#

 recently had the need to convert simple strings back and forth from Base64 encoding. It turned out to be relatively simple in .Net, once you figured out which class libraries you needed to combine.
It turns out the System.Convert has two handy methods for dealing with Base64, ToBase64String and FromBase64String. On the ToBase64String, we have a bit of a challenge, since it expects a byte array and not a string to be passed in.
It does make a certain amount of sense, typically you aren’t encoding a simple string but instead a binary object such as a file, which is usually represented as an array of bytes. For us, this means we have to take our string and convert it to a byte array.
You’d think the string class would have a nice static method to handle this, but alas it does not. Instead we have to turn to System.Text. I imagine most of you are working with ASCII encoding, so here we’ll call on the ASCIIEncoding.ASCIII class, and use it’s GetBytes to convert a string to bytes.
The small method below combines the two methods I’ve described to create a Base64 encoded string from a normal string.

    static public string EncodeTo64(string toEncode)
    {
      byte[] toEncodeAsBytes
            = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
      string returnValue
            = System.Convert.ToBase64String(toEncodeAsBytes);
      return returnValue;
    }

Note two things, first I am using ASCII encoding, which should cover most folks. Just in case though, System.Text has encodings for the various flavors of UTF as well as Unicode. Just choose the appropriate encoding method for your need.
Second, I made the class static because I was using a console app for my test harness. While it could be static in your class, there’s no reason it has to be. Your choice.
OK, we’ve got the string encoded, at some point we’re going to want to decode it. We essentially do the reverse of encoding, we call the FromBase64String and pass in our encoded string, which returns a byte array. We then call the AsciiEncoding GetString to convert our byte array to a string. Here’s a small method to Decode your Base64 strings.

    static public string DecodeFrom64(string encodedData)
    {
      byte[] encodedDataAsBytes
          = System.Convert.FromBase64String(encodedData);
      string returnValue =
         System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
      return returnValue;
    }

Finally, here’s a simple test harness, done in a console app, to show you calls to the two methods.


      string myData = “Here is a string to encode.”;

      string myDataEncoded = EncodeTo64(myData);
      Console.WriteLine(myDataEncoded);

      string myDataUnencoded = DecodeFrom64(myDataEncoded);
      Console.WriteLine(myDataUnencoded);

      Console.ReadLine();

Be aware, I’ve done no error checking here. My little methods assume that the data you are decoding will properly convert to and from a string. If that’s not the case you could wind up with a serious case of gibberish, if not cause a run time exception. If you are not positive that all you are dealing with is simple strings, then make effort to include some try / catch logic in your implementation.

Fuente: http://arcanecode.com/2007/03/21/encoding-strings-to-base64-in-c/

Generando un hash MD5 con ASP.NET y C# de forma sencilla y simple.

El MD5 es un algoritmo criptográfico de 128 bits. Fue desarrollado por Ronald Rivest (profesor del MIT) en el año 91 como sucesor del MD4 y pesar de que en el año 96 fue anunciada una colisión de hash planteándose por lo tanto dudas sobre su futuro, a día de hoy es muy usado.
Por medio del MD5, vamos a obtener un hash sobre un conjunto de datos. Un hash viene a ser un conjunto de datos obtenido en base a otros.
Este tipo de algoritmos, se usa para certificar que una secuencia de datos no ha sido alterada, ya que si se modifica el valor del hash, implica que esa información ha cambiado.
El resultado obtenido por medio de un MD5 es una cadena hexadecimal de 32 dígitos.

¿Cómo podemos obtener un hash mediante el MD5?

Pues vamos a verlo, la verdad es que generar un hash MD5 con C# es sencillo dado que el Framework (como siempre) nos proporcionan unas clases para realizar esto.
Lo único que tenemos que hacer es crear una instancia de la clase MD5 y pasarle un array de bytes al método ComputeHash.
El código necesario es el siguiente:

public static string GetMD5(string str)
{
MD5 md5 = MD5CryptoServiceProvider.Create();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] stream = null;
StringBuilder sb = new StringBuilder();
stream = md5.ComputeHash(encoding.GetBytes(str));
for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
return sb.ToString();
}

Como veis, es muy sencillo y creo que la única aclaración necesaria es la de la conversión del string. Pues bien, dado que la salida es una cadena hexadecimal de 32 dígitos, en el momento que estamos haciendo la conversión, tenemos que indicarlo, por eso, le pasamos como formato esperado el :x2.

Como siempre, mi consejo es que os bajéis el código ya que así lo podéis testear con una prueba unitaria y ver cómo funciona en detalle.

Fuente: https://adeshoras.wordpress.com/2008/06/10/generando-un-hash-md5-con-aspnet-y-c-de-forma-sencilla-y-simple/

Generando un hash sha1 con ASP.NET y C# de forma sencilla y simple.

SHA1 es un algoritmo criptográfico perteneciente a la familia de algoritmos criptográficos SHA (Secure Hash Algorithm o Algoritmo de Hash Seguro) de la Agencia Nacional de Seguridad de Estados Unidos y desarrollada por el NIST (National Institude of Standards and Technology).
El primero de estos algoritmos fue desarrollado en el año 93 y fue el SHA (ahora conocido como SHA-0), 4 años después, fue sustituido por el SHA1 y posteriormente han aparecido SHA-224, SHA-256, SHA-384 y SHA-512 y todos son conocidos como SHA-2.
En 1998, se encontró una vulnerabilidad en SHA-0 pero esta no afectaba a SHA1 del cual no se ha encontrado ningún ataque efectivo. En 2004, fueron publicados una serie de ataques sobre hash parecidos al que genera SHA-1 planteándose por lo tanto dudas sobre la seguridad que este aporta.
Por medio del SHA1, vamos a obtener un hash sobre un conjunto de datos. Un hash viene a ser un conjunto de datos obtenido en base a otros.
Este tipo de algoritmos, se usa para certificar que una secuencia de datos no ha sido alterada, ya que si se modifica el valor del hash, implica que esa información ha sido alterada.
SHA1 produce una salida de 160 bits de un mensaje que puede tener un tamaño máximo de 264 bits y se basa en principios similares a los usados por Ronald Rivest (del MIT) para desarrollar los algoritmos MD4 y MD5.

¿Cómo podemos obtener un hash mediante el SHA1?

Pues vamos a verlo, la verdad es que con c# es sencillo dado que el Framework (como siempre) nos proporcionan unas clases para realizar esto.
Lo único que tenemos que hacer es crear una instancia de la clase SHA1 y pasarle un array de bytes al método ComputeHash.
El código necesario es el siguiente:

public static string GetSHA1(string str)
{
SHA1 sha1 = SHA1Managed.Create();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] stream = null;
StringBuilder sb = new StringBuilder();
stream = sha1.ComputeHash(encoding.GetBytes(str));
for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
return sb.ToString();
}



Y esto es todo amigos míos, como siempre, mi consejo es que os bajéis el código ya que así lo podéis testear con una prueba unitaria y ver cómo funciona en detalle.

Fuente: https://adeshoras.wordpress.com/2008/06/23/generando-un-hash-sha1-con-aspnet-y-c-de-forma-sencilla-y-simple/

miércoles, 10 de junio de 2015

recursos debug


Master
http://www.codeproject.com/Articles/79508/Mastering-Debugging-in-Visual-Studio-A-Beginn

https://msdn.microsoft.com/es-co/library/f177hahy.aspx

https://msdn.microsoft.com/es-es/library/vstudio/c785s0kz(v=vs.110).aspx


martes, 9 de junio de 2015

recursos linq y nhibernate


http://ayende.com/blog/2227/implementing-linq-for-nhibernate-a-how-to-guide-part-1

http://mhinze.com/2008/07/22/linq-to-nhibernate-in-10-minutes/

http://www.d80.co.uk/post/2011/02/20/Linq-to-NHibernate-Tutorial.aspx

http://www.d80.co.uk/post/2011/02/20/linq-to-nhibernate-tutorial.aspx

http://stackoverflow.com/questions/8766794/how-to-create-generic-data-access-object-dao-crud-methods-with-linq-to-sql

martes, 2 de junio de 2015

recursos sobre linq

Buenos días,

Material cuando encontramos errores en linq:

https://social.msdn.microsoft.com/Forums/es-ES/1eb1ef7a-6ae7-41ff-821e-f25ba47bac58/comparar-dos-list-en-c?forum=linqes --Comparar dos listas

http://stackoverflow.com/questions/11821644/how-can-i-compare-each-element-of-a-list-with-itself-only-once
http://stackoverflow.com/questions/11957685/compare-two-list-and-return-not-matching-items-using-linq
http://stackoverflow.com/questions/3102661/compare-two-list-elements-with-linq
http://stackoverflow.com/questions/8155278/efficient-list-self-compare-in-linq
http://blogs.msdn.com/b/ericwhite/archive/2008/11/07/debugging-linq-queries.aspx
https://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/
http://stackoverflow.com/questions/952796/debugging-linq-queries
https://social.msdn.microsoft.com/Forums/es-ES/ce17eb56-c20d-48b0-91bd-b50a8864ce5f/lambda-expression-vs-linq?forum=adodotnetentityframeworkes
http://stackoverflow.com/questions/772261/the-or-operator-in-linq-with-c-sharp
http://www.dotnetperls.com/linq
https://msdn.microsoft.com/es-co/library/bb397900.aspx
https://social.msdn.microsoft.com/Forums/en-US/ccd6cac7-85d0-4b42-b26c-485d6d2a5f65/and-in-linq-is-it-possible?forum=linqprojectgeneral
http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/
http://speakingin.net/tutorial-de-linq-to-sql/
http://blog.foxandxss.net/operadores-de-linq-filtering

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