sexta-feira, 21 de dezembro de 2012

Video Aula: Padrão de Projeto Singleton


O Papel Estratégico do Arquiteto de Software




domingo, 9 de dezembro de 2012

Capturando O nome do dia da Semana em português com Extension

Essa é uma extensão do datetime para ser usado em qualquer datetime para capturar o nome do dia da semana em português, vejo algumas conversões bem manuais, espero que o codigo abaixo seja util.

 
 public static string DiaDaSemana(this DateTime value)
        {
                CultureInfo culture = new CultureInfo("pt-BR");
                DateTimeFormatInfo dtfi = culture.DateTimeFormat;
                return dtfi.GetDayName(value.DayOfWeek);
        }

Capturando Contexto (DataContext) de uma Entidade com Extesion e Reflection


Já se deparou com a necessidade de saber o Contexto a partir da entidade instanciada? Esses dias me deparei com essa necessidade, pois precisava capturar valores alterados na entidade para gravar em um log, foi ai que precisei dessa funcionalidade, eu construi ela como uma extensao de INotifyPropertyChanging não é a forma correta mas funciona mto bem quando trabalhamos com linq to sql e com EF.


        public static DataContext GetContext(this INotifyPropertyChanging objetoeto)

        {

            FieldInfo fEvent = objeto.GetType().GetField("PropertyChanging", BindingFlags.NonPublic | BindingFlags.Instance);

            MulticastDelegate dEvent = (MulticastDelegate)fEvent.GetValue(objeto);

            Delegate[] onChangingHandlers = dEvent.GetInvocationList();



          

            foreach (Delegate handler in onChangingHandlers)

            {

                if (handler.Target.GetType().Name == "StandardChangeTracker")

                {

                    objetoect tracker = handler.Target;

                    objetoect services = tracker.GetType().GetField("services", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(tracker);



                    DataContext context = services.GetType().GetProperty("Context").GetValue(services, null) as DataContext;

                    return context;

                }

            }





            throw new Exception("Erro ao capturar contexto");

        }

sexta-feira, 7 de dezembro de 2012

Extension com c# .Net

Extensions é um recurso muito bom para se usar em orientação a objetos, você estende a uma classe existente adicionando novos métodos com sua regra. Assim você pode por exemplo criar um método que converte String para Int32? e estender para suas strings, ou seja qualquer coisa que retorne uma string terá esse método implementando.

Lisgatem 1: Alguns exemplos de estensao para classe string
    public  static class ExtensionsString
    {
public static short? ConvertToInt16(this string value)
            {
                if (string.IsNullOrEmpty(value))
                    return null;

                return Convert.ToInt16(value);
            }

            public static Int32? ConvertToInt32(this string value)
            {
                if (string.IsNullOrEmpty(value))
                    return null;

                return Convert.ToInt32(value);
            }

            public static long? ConvertToInt64(this string value)
            {
                if (string.IsNullOrEmpty(value))
                    return null;

                return Convert.ToInt64(value);
            }
    }

Para usar nossa estensão apenas precisamos digitar a chamada.

 Listagem 2: Exemplo de uma chamada a uma estensão criada na listagem 1

String Nota = "8";
Int32? ValorInteiroNota = Nota.ConvertToInt32()

Podemos ousar mais e cria Métodos mais rebuscados, que popula uma DropDownList ou outro método mais interessante.

 Listagem 3: Métodos mais rebuscados

 public static void PopularDDl(this DropDownList ddl, object Lista, string DataTextField, String DataValueField)
            {
                ddl.Items.Clear();
                ddl.DataTextField = DataTextField;
                ddl.DataValueField = DataValueField;
                ddl.DataSource = Lista;
                ddl.DataBind();
                ddl.Items.Insert(0, new ListItem("Selecione...", ""));
                ddl.SelectedValue.Equals(0);
               

            }

quarta-feira, 5 de dezembro de 2012

Convertendo Enumeradores em sua Entidade e Retornando uma descrição amigável de forma Simples.

Nesse artigo iremos fazer uma conversao de dados em nossa entidade, em nosso exemplo possuimos uma entidade Usuario que possui uma propriedade chamada Status que guarda um Int que relaciona com o status do usuario. Esses status estao representados no enum StatusEnum, conforme abaixo:
    public enum StatusEnum
    {
        [Description("Usuário em Analise")]
        EmAnalise = 1,
        [Description("Usuário Autorizado")]
        Autorizado = 2,
        [Description("Usuário Banido")]
        Banido = 3,
    }
 
Interessante é criar uma Classe Estática Util com um metodo para capturar o Description e apresentar em nossa camada de Apresentação.
 
        public static class Util
 {
        public static string ObterDescricaoStatusEnum(StatusSolicitacaoEnum valor) {
            FieldInfo fieldInfo = valor.GetType().GetField(valor.ToString());

            DescriptionAttribute[] atributos = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

            return atributos.Length > 0 ? atributos[0].Description ?? "Nulo" : valor.ToString();
        } 
 }
 
Agora vamos dar uma olhada em nossa Entidade Usuario.

Poderiamos fazer as alterações direto no código da entidade, mas caso estejamos usando um ORM como EF ou Linq to Sql teriamos um problema a cada atualização do banco de dados pois qualquer código que colocassemos seria sobrescrito. Para resolver esse problema o ideal é criamos uma classe separada para cada entidade, mas utilizando o PARTIAL e inserindo nossas regras, conforme exemplo abaixo:
 public partial class Usuario
    {
        string _StatusString;
        public string StatusString
        {
            get
            {
                switch (this.Status)
                {
                    case 1:
                        _StatusString = Util.ObterDescricaoStatusEnum(StatusSolicitacaoEnum.EmAnalise);
                        break;
                    case 2:
                        _StatusString = Util.ObterDescricaoStatusEnum(StatusSolicitacaoEnum.Autorizado);
                        break;
                    case 3:
                        _StatusString = Util.ObterDescricaoStatusEnum(StatusSolicitacaoEnumBanido);
                        break;
                }
                return _StatusString;
            }
        }
 }
 
Agora possuimo uma nova propriedade que podemos acessar via entidade, segue exemplo:
 Usuario usuario = new Usuario();
 string Status = usuario.StatusString;
 

Adendo

Nos comentarios, um desenvolvedor, sugeriu algumas melhorias, que apliquei após corrigir um equivoco cometido pelo nosso colega, esse equivoco nos levava a possuir duplicação de código, mas ao ajustar a idéia do companheiro o resultado ficou muito elegante segue o codigo:
        public static string ObterDescricao(this Enum valor)
        {
            FieldInfo fieldInfo = valor.GetType().GetField(valor.ToString());

            DescriptionAttribute[] atributos = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

            return atributos.Length > 0 ? atributos[0].Description ?? "Nulo" : valor.ToString();
        }
Para Obtermos a descrição o código ficaria assim:
public partial class Usuario
   {
       string _StatusString;
       public string StatusString
       {
           get
           {
               switch (this.Status)
               {
                   case 1:
                       _StatusString = StatusSolicitacaoEnum.EmAnalise.ObterDescricao();
                       break;
                   case 2:
                       _StatusString = StatusSolicitacaoEnum.Autorizado.ObterDescricao();
                       break;
                   case 3:
                       _StatusString = StatusSolicitacaoEnum.Banido.ObterDescricao();
                       break;
               }
               return _StatusString;
           }
       }
}
Espero que o artigo tenha ajudado a todos. Por favor curtam nossa Page no facebook assim poderemos criar mais artigos e lancar mais videos. https://www.facebook.com/arquiteturadotnet