Contents tagged with Desenvolvimento

  • NHibernate + Fluent :: Mapeamento de campo varchar com valor separado por caracter com conversão em propriedade de coleção no domínio automaticamente

    16/06/2016

    Trabalhando em um projeto recente esbarrei na seguinte necessidade, um campo "varchar" na tabela XPTO possuirá conteúdo no seguinte formato:
    
    

    65;78;21;6;98

    
    
    É um caso bem conhecido, algo que em um banco de dados normalizado se transformaria em uma agregação, mas que nesse específico o conteúdo são as chaves estrangeiras para uma tabela separadas por ; (ou qualquer outro separador de valor) gravado em um campo na tabela.
    
    
    A solução mais comum para esse tipo de caso seria tratar em um DTO, Model ou semelhante o retorno de uma propriedade com a coleção, um array por exemplo, após a leitura do campo que contém a lista concatenada. 
    
    
    Usando Fluent e NHibernate (não testei sem Fluent) temos uma maneira mais direta e elegante de fazer o mesmo.
    
    
    
    
    
    
    Na classe de mapeamento definimos a seguinte regra: 
    
    
    Map(x => x.PropriedadeDaColecao"CampoComAListaConcatenada").CustomType(typeof(string)).Access.CamelCaseField(Prefix.Underscore);
    
    
    
    
    
    
    
    Na classe de domínio a seguinte definição de propriedade:
    
    
            protected string _propriedadeDaColecao; 
            public virtual List<int> PropriedadeDaColecao
            {
                get
                {
                    if (string.IsNullOrEmpty(_propriedadeDaColecao))
                    { 
                        return new List<int>();
                    }
     
                    return _propriedadeDaColecao.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Select(n => int.Parse(n)).ToList();
                }
                set
                {
                    _propriedadeDaColecaostring.Join(";"value);
                }
            }
    
    
    
    
    Apesar de mapearmos o campo "varchar" CampoComAListaConcatenada para a propriedade PropriedadeDaColecao, que é do "tipo coleção" - ao invés do tipo string como seria o correto - a definição do CustomType faz o que é necessário para se adequar ao domínio.
    
    
    Uma explicação superficial é que através da definição ".Access.CamelCaseField(Prefix.Underscore)" o Fluent sabe que deve atribuir e recuperar o valor direto de _propriedadeDaColecao, que vemos que está declarada como "protected" ao invés de "private". A PropriedadeDaColecao será usada pelo programador de forma transparente como uma coleção.
    
    
    É até natural a leitura do código, estamos dizendo que o CustomType é do tipo string, acessado através do "field" que está definido em CamelCase com o prefixo _ (underscore), ou seja, para PropriedadeDaColecao ele encontrará por Reflection _propriedadeDaColecao.
    
    
    
    
    Uma outra possibilidade seria construirmos uma classe CustomType para o mapeamento, mas se temos essa possibilidade de conversão direta porque não usar?


  • Wijmo, muito bom, fácil de implantar e leve, mas peca em documentação

    15/06/2016

    O Wijmo, muito bom, fácil de implantar e leve, mas peca em documentação.

    Você rala para descobrir funções, pesquisa artigos e então descobrei que o problema é que as soluções em artigos estão obsoletas e que a documentação não explica o que deveria.

    Exemplo recente, precisa recuperar os eventos (appointments) do Event Calendar, segundo a documentação bastaria acessar à propriedade "appointments", mas esta sempre retorna vazio.

     appointments: /// <summary>  
         /// The event objects array. This option is deprecated:  
         ///     please, use eventsData option, instead.  
    

    Somente abrindo o código que agora a propriedade é "eventsData" na versão atual (desde quando?) que é a 2013.1.

    Então a linha de código correta é:

     var eventos = $("#eventscalendar").wijevcal("option", "eventsData");  
    

    É o velho problema dos manuais que não acompanham a evolução dos softwares produzidos.


  • Como fazer o deploy de WebParts desenvolvidas no Visual Studio 2010 no Sharepoint 2010

    15/06/2016

    Há alguns anos eu precisei desenvolver WebParts para Sharepoint 2010 e nas pesquisas sobre como implantar em produção resumi para os seguintes comandos:

     

    • Adicionar a solution da feature utilizando o stsadm:
      stsadm -o addsolution -filename MinhaSolution.wsp
       
    • Depois de adicionar a solution, você deve executar o deploy no seu site. Para isto você pode utilizar o stsadm:
      stsadm -o deploysolution -name MinhaSolution.wsp -immediate -allcontenturls -allowgacdeployment

      -allcontenturls : instalar em todos os sites, se você quiser especificar qual site instalar troque pelo parametro "-url http:\nomedoserver:porta"
      -allowgacdeployment : instalar dependências configuradas na GAC.       
       
    • Atualizar uma solution:
      stsadm -o upgradesolution -name MinhaSolution.wsp -filename MinhaSolution.wsp -immediate -allowgacdeployment


    Eu tinha feito um pequeno manual usando os comandos dentro do shell do Sharepoint ao invés do STSADM, mas não encontrei, caso o encontre atualizo este post.



    Origem: http://marcelocml.wordpress.com/2010/02/03/deploy-de-uma-solution-wsp-no-sharepoint/