Pesquisar

Mostrando postagens com marcador melhores práticas. Mostrar todas as postagens
Mostrando postagens com marcador melhores práticas. Mostrar todas as postagens

Fluent NNhibernate e Auto Mapping

Com o Fluent Nhibernate é possivel utilizar-se do padrão “Convention over Configuration”, Convençao sobre Configuração, quem é programador Java, ou de outras linguagens de script já usam bastante deste padrão, mas para .Net isto não é tão comum assim. Este padrão permite que não precisamos configurar nosso mapeamento, pois ele está implicito na declaração de nossas classes, possibilitado pela convençao. Por exemplo quando criamos um campo Id em nossa classe não necessitamos mapear essa propriedade, pois a convenção nos diz q ele vai ser uma chave primaria de nossa tabela.
O Fluent Nhibernate permite que seja mapeado as classe através dessa convenção, devemos apenas dizer quais as nossas classes devem ser mapeadas.
var mapeamento = AutoMap.AssemblyOf<Dominio.Entidades.Core.Usuario>(convencoes); //Qual assembly deve ser mapeado

var cfgFluent = FluentNHibernate.Cfg.Fluently.Configure(cfg).Mappings(x =>
x.AutoMappings.Add(mapeamento));

cfg = cfgFluent.BuildConfiguration();
this.FabricaSessao = BuildSessionFactory(cfg);

No caso acima passamos o assembly da classe Usuario, fazendo com que todas as outras classes sejam mapeadas.

public class Usuario : IEntidade
{
public virtual long Id { get; set; }

public virtual string Nome { get; set; }
}

A classe Usuário será mapeada para um tabela, onde o Id será a chave primária, e  o campo Nome será um varchar.

Porém necessitamos fazer alguns refinamentos nesses mapeamentos, por exemplo caso queiramos adicionar um prefixo no nome da tabela, ou por exemplo definir o tamanho do campo Nome no banco? Teremos que adicionar os mapeamentos um a um?  Ai entra a possibilidade de extensão do Fluent, todas as convençoes podem ser implementadas manualmente extendendo as convenções padrões.

public class TableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table("tb_" + instance.EntityType.Name);
}
}


Neste exemplo criamos uma convenção para o nome da tabela que será gerado, implementamos o IClassConvention, e setamos o nome da tabela que queremos. Todas as interfaces que podem ser implementadas estão no namespace using FluentNHibernate.Conventions.

Na hora de configurar o Fluent devemos adicionar nossas convenções antes de criar a SessionFactory.

var mapeamento = AutoMap.AssemblyOf<Dominio.Entidades.Core.Usuario>(convencoes); //Qual assembly deve ser mapeado
mapeamento.Conventions.Add<TableNameConvention>();
mapeamento.Conventions.Add<PrimaryKeyNameConvention>();

var cfgFluent = FluentNHibernate.Cfg.Fluently.Configure(cfg).Mappings(x =>
x.AutoMappings.Add(mapeamento));

Desta forma o Fluent saberá que deverá usar nossas classes de configuração.

Essa apenas uma das maneiras que o Fluent permite fazer, temos outras mais em exemplos por ai na internet. Vale a pena dar uma olhada e verificar qual melhor se aplica ao seu projeto. Isso é muito util no caso de você já ter algumas convenções que usa e não quer mudar e para código legado.

Estilos e Grid no WPF

Uma das coisas mais demoradas e chatas no desenvolvimento Windows, depois de escrever Sql (brincadeirinha), é o alinhamento de controles e botões na tela. O Visual Studio nos traz várias ferramentas que alinham os botões, aumenta o espaçamento, etc, mas mesmo assim a vida do desenvolvedor fica um pouco complicado. Com o WPF e estilos ao formato dos estilos css da web, podemos criar telas mais faceis de serem escritas através do xaml.
O WPF nos permite definir Grids em nosso formularios e criar linhas e colunas imaginarias onde nossos controles irão ficar. Vamos usar isso para criar a definição dessas linhas e após adicionarmos nossos controles nessas linhas e definirmos um tamanho. Algo como na figura abaixo.
image
Primeiro criamos um estilo para a nossa aplicação, onde devemos colocar o tamanho das colunas e linhas, e o tamanho dos componentes.
Como vocês pode ve
<Style TargetType="ColumnDefinition">        
<Setter Property="MinWidth" Value="70" />
</Style>
<Style TargetType="RowDefinition">
<Setter Property="Height" Value="50" />
</Style>

<Style x:Key="LabelUm" TargetType="Label">        
<Setter Property="Height" Value="23" />
<Setter Property="VerticalAlignment" Value="Top" />
</Style>

<Style x:Key="LabelDois" TargetType="Label" BasedOn="{StaticResource LabelUm}">
<Setter Property="Grid.ColumnSpan" Value="2" />
</Style>

<Style x:Key="LabelTres" TargetType="Label" BasedOn="{StaticResource LabelUm}">
<Setter Property="Grid.ColumnSpan" Value="3" />
</Style>
r, nós criamos o tamanho da coluna e da linha, e adicionamos os tamanhos dos labels, apartir da propriedade Grid.ColumnSpan, que permite que um label ocupe o espaço de duas colunas, ou uma.

E agora o nosso formulário principal, onde chamamos os estilos e adicionamos eles aos labels, e textbox, desta forma eles vão se alinhando automaticamente. A idéia é igual a programação Web, criar um estilo e fazer o alinhamento apartir do estilo. Aqui vai o código do formulario principal.

<Window x:Class="MecanicaWPF.CadastroCliente" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MecanicaWPF"
Title="Cadastro de Clientes">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>                
<ResourceDictionary Source="../EstilosFormulario.xaml" />                
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<TabControl Margin="12,12,12,42" Name="tabControleCliente" Height="507">
<TabItem Name="tabCliente" Header="Dados do Cliente">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>                     
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<Label Grid.Row="0" Content="Nome do Cliente:" Style="{StaticResource LabelSeis}" />
<TextBox Grid.Row="0" Name="txtCliente" Style="{StaticResource TextBoxSeis}" />

<Label Grid.Row="0" Grid.Column="6" Content="CPF/CNPJ:" Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="0" Grid.Column="6" Name="txtCpfCnpj" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="1" Content="Tipo:"  Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="1" Name="txtTipoPessoa" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="1" Grid.Column="2" Content="Enquadramento Cliente:"  Style="{StaticResource LabelSeis}" />
<RadioButton Grid.Row="1" Grid.Column="2" Content="Cliente" Name="rdbCliente" Style="{StaticResource Dois}"/>
<RadioButton Grid.Row="1" Grid.Column="4" Content="Fornecedor" Name="rdbFornecedor" Style="{StaticResource Dois}"/>
<RadioButton Grid.Row="1" Grid.Column="6" Content="Ambos" Name="rdbAmbos" Style="{StaticResource Dois}"/>

<Label Grid.Row="2" Content="RG/Inscricao:"  Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="2" Name="txtRgInscricao" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="2" Grid.Column="2" Content="Telefone 1:"  Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="2" Grid.Column="2" Name="txtTelefoneUm" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="2" Grid.Column="4" Content="Telefone 2:"  Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="2" Grid.Column="4" Name="txtTelefoneDois" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="2" Grid.Column="6" Content="Cliente desde:"  Style="{StaticResource LabelDois}" />
<TextBox Grid.Row="2" Grid.Column="6" Name="txtClienteDesde" Style="{StaticResource TextBoxDois}" />

<Label Grid.Row="3" Content="Email:"  Style="{StaticResource LabelQuatro}" />
<TextBox Grid.Row="3" Name="txtEmail" Style="{StaticResource TextBoxQuatro}" />

<Label Grid.Row="3" Grid.Column="4" Content="Contato:"  Style="{StaticResource LabelQuatro}" />
<TextBox Grid.Row="3" Grid.Column="4" Name="txtContato" Style="{StaticResource TextBoxQuatro}" />

<Label Grid.Row="4"  Content="Observacao:"  Style="{StaticResource LabelOito}" />
<TextBox Grid.Row="4" Grid.RowSpan="4" Name="txtObservacao"  Style="{StaticResource TextBoxOito}" AcceptsReturn="True" AutoWordSelection="True" VerticalScrollBarVisibility="Auto" />
</Grid>



Como vocês podem ver, eu apenas adiciono aos controles a linha e o tamanho dele, um, dois, tres, etc. O código fica muito mais limpo, sem posições, ancoras, etc. Este exemplo é redimensionavel conforme a janela.

Código Limpo

Apresentação de slides referente aos capitulos iniciais do livro Código Limpo escrito por Robert Martin, mais conhecido como Uncle Bob.
http://www.slideshare.net/nsitechtalks/cdigo-limpo
Vale a pena compartilhar esse link. Essa leitura é obrigatória a todo programador que quer se tornar um melhor programador.

Convertendo Datas e Números

Hoje vou falar sobre conversão de valores numericos e datas. Vejo muita gente fazendo conversões do tipo:

int valor = Convert.ToInt32(textbox1.Text);

O que acontecerá se o usuario não digitar um número? O que você faz? Coloca um try catch envolvendo tudo e diz para o usuário que aconteceu um erro?


A maioria dos programadores tem preguiça de efetuar isto do modo certo. Devemos sempre verificar se o que a gente está convertendo é um valor verdadeiro.


int valor;
int.TryParse(textbox1.Text, out valor);

Este é um caso onde o valor não é obrigatório, caso o usuário não digite um número verdadeiro a funçaõ TryParse irá setar o valor 0 para o valor. Agora caso precisemos que o usuário digite um número devemos efetuar o seguinte:


            int valor;
if (int.TryParse(textbox1.Text, out valor))
{
//Valor Verdadeiro
}



Isto vale para os outros tipos: double, long, decimal, todos eles possuem o método TryParse() que retorna um booleano, devemos usar sempre que possível esta função. Ela usa as configurações regionais do Windows, então caso seu windows estiver configurado como separador decimal o ponto, e vc digitar o valor “12.00”, ele vai converter para doze, agora caso esteja configurado para virgula o valor resultante será mil e duzentos.Isso é muito util pois respeita as configurações que o usuário está acostumado a usar em seu computador.


Devemos utilizar este método especialmente com datas, pois ele vai fazer a conversão de acordo com as configurações do seu computador. Lembre-se DateTime.TryParse().


O próximo post será sobre datas no banco de dados.

Programadores Bons

Segue link de um post muito bom falando sobre a importância de um programador e código bem escrito.
http://imasters.com.br/artigo/20302/carreira/verdades-nao-tao-conhecidas-sobre-programacao
Os gerentes de TI ainda não dão o merecido valor a um bom design e um bom código, pelo menos as pequenas companhias.