Temple Coding

  • Home
  • Open Source
  • Sobre
    • Livros que estou lendo
    • Sobre
RSS
Category Archives: ASPNET MVC

Validação com Asp.NET MVC2 parte 2 – validações customizadas

Posted on 18/02/2010 by vintem
No Comments

Dando sequência no post anterior sobre a validação no MVC2, vou mostrar como é simples fazer uma validação customizada além das existentes no namespace System.ComponenteModel.DataAnnotations.

Para fazer uma validação customizada tudo que precisamos fazer é herdar a classe ValidationAttribute do namespace System.ComponentModel.DataAnnotations, isso, claro, para fazer uma validação genérica, é possível também herdar as outras classes de validação desse namespace como RequiredAttribute, RegularExpressionAttribute e assim por diante.

Por exemplo, e seguindo o exemplo do post anterior, vamos imaginar que para cadastrar um novo cliente em nossa base, além das validações que já estamos fazendo, queremos garantir que o email do cliente seja único na base. Podemos fazer o seguinte, criamos uma classe ClienteUnicoAttribute que herda de ValidationAttribute e ai decoramos o atributo email da classe cliente com o nosso validador.

A classe ClienteUnicoAttribute fica assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
 public class ClienteUnicoAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        // validação real vai aqui
        return (!value.ToString().Equals("teste@teste.com"));
    }
}

Simples, o importante aqui é sobrescrever o método IsValid com a lógica que queremos, no caso aqui, para manter simples, estou apenas verificando se o email é igual teste@teste.com então retorno false, caso contrário retorno true.

Na classe Cliente vamos decorar o atributo Email com o novo validador e fica assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Cliente
{
    public int IdCliente { get; set; }
    [Required(ErrorMessage = "Preencha o nome")]
    public string Nome { get; set; }
    [Required(ErrorMessage = "Preencha a idade")]
    [Range(0, 150, ErrorMessage="Idade inválida")]
    public int? Idade { get; set; }
    [Required(ErrorMessage = "Preencha o email")]
    [RegularExpression(@"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$", ErrorMessage = "Email inválido")]
    [ClienteUnico(ErrorMessage="Email de cliente já cadastrado")]
    public string Email { get; set; }
}

Agora, se tentarmos cadastrar um cliente com email teste@teste.com veremos o erro:

Tweet
government,politics news,politics news,politics
Categories: ASPNET MVC | Tags: asp.net mvc, templates

Validação com Asp.Net MVC2

Posted on 07/02/2010 by vintem
No Comments

OK, eu mal terminei meu primeiro projeto real com o Asp.Net MVC e o Asp.Net MVC já está quase na segunda versão que deve sair em março, junto com o Visual Studio 2010 e o .Net 4.

De qualquer forma, já é hora de começar a se atualizar e estava eu lendo e testando o Asp.Net MVC 2 e uma das coisas que eu mais gostei é a forma de validação usando o namespace System.ComponentModel.DataAnnotations que agora já faz parte do .Net Framework. Mas melhor ainda é ver como a validação por javascript ficou simples, e muito importante, seguindo os principios do DRY.

Eu estou testando o MVC2 no Visual Studio 2010 beta2, mas não é obrigatório fazer dessa forma, é possível utilizar o Visual Studio 2008 também. A partir do momento que o MVC2 está instalado é possível criar um projeto do tipo Asp.Net MVC2 Web Application.

Criado o projeto a primeira coisa que vamos fazer é criar uma classe de model:

?View Code CSHARP
1
2
3
4
5
6
7
public class Cliente
{
    public int IdCliente { get; set; }
    public string Nome { get; set; }
    public int? Idade{ get; set; }
    public string Email { get; set; }
}

Depois disso precisamos definir o que será validado. Vamos definir isso direto na classe do model. Para isso primeiro temos que dizer que nossa classe está usando o namespace System.ComponentModel.DataAnnotations.

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
public class Cliente
{
    public int IdCliente { get; set; }
    [Required(ErrorMessage = "Preencha o nome")]
    public string Nome { get; set; }
    [Required(ErrorMessage = "Preencha a idade")]
    [Range(0, 150, ErrorMessage="Idade inválida")]
    public int? Idade { get; set; }
    [Required(ErrorMessage = "Preencha o email")]
    [RegularExpression(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$", ErrorMessage = "Email inválido")]
    public string Email { get; set; }
}

Como vimos, basta decorar os métodos com os atributos de validação e colocar as mensagens de erro. É possível também, ao invés de colocar as mensagens de erro diretamente, colocar uma referência para um Resource e, portanto, utilizar a internacionalização.

Agora vamos criar uma classe de controller com o método de Create.

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ClienteController : Controller
{
    public ActionResult Create()
    {
        return View(new Cliente());
    }
 
    [HttpPost]
    public ActionResult Create(Cliente novoCliente)
    {
        if (ModelState.IsValid)
        {
            // Salvar no Banco de Dados
            return Redirect("/");
        }
 
        return View(novoCliente);
    }
}

Dois métodos create, um para exibir o formulário vazio e outro para processar a criação do nosso cliente. Veja que agora temos um atributo HttpPost para decorar os métodos que só serão acessados via post, não é mais feito usando AcceptVerbs(HttpVerbs.Post).

De resto, esse método funciona como no MVC1, ao submeter o formulário o MVC faz o binding dos campos e cria o objeto Cliente e também executa a validação. Se não for encontrado nenhum erro, podemos salvar no banco de dados, caso tenha algum erro o formulário é apresentado novamente com os campos já preenchidos, por isso passamos o objeto criado de volta ao formulário.

Vamos criar a View como fazemos normalmente no MVC. Botão direito dentro do método Create -> Add View, selecionar Create a strongly-typed view, a nossa classe Cliente e no View Content: a opção Create:

Deve ser gerado uma View como a abaixo:

Agora, ao acessar a página de criação de cliente e tentar criar um novo cliente sem preencher nada veremos o seguinte:

Fácil não? Agora só falta fazer a validação por javascript. Existe duas formas de fazer isso, usando a biblioteca de ajax da Microsoft ou usando jQuery. No fim, não muda muito, só as referências que são adicionadas  na página. Vou fazer aqui usando o jQuery. Vamos alterar a view de criação de cliente para que fique assim:

Pronto. Isso é tudo que precisa ser feito para que a validação funcione com javascript, adicionar as referências às bibliotecas do jQuery e à biblioteca MicrosoftMvcJQueryValidation.js e por fim, habilitar a validação no cliente chamando o método Html.EnableClientValidation.

É possível também criar uma validação customizada, mas eu vou mostrar isso num próximo post.

Existem outras mudanças na forma de validação do MVC2 como, por exemplo, agora é possível utilizar o Enterprise Library Validation Block para fazer a validação. Além disso, o modelo de validação também mudou, mas isso também vale um outro post.

Tweet
government,politics news,politics news,politics
Categories: ASPNET MVC | Tags: asp.net mvc

Dependency Injection com StructureMap e Asp.Net MVC

Posted on 09/12/2009 by vintem
No Comments

Ok, então você começou a usar o Dependency Injection e viu que dava muito trabalho. A boa notícia é que existem vários frameworks por aí que ajudam a diminuir o trabalho e ainda a ter um código muito mais limpo.

Particularmente, eu gosto muito do StructureMap, principalmente porque ele nos permite utilizar o “Convention over Configuration”. Vamos ver jajá como isso funciona.

Bom, dando sequência no post anterior, vamos modificar aquele código para utilizar o StructureMap. A primeira coisa a fazer obviamente é baixar o framework e adicionar uma referência para o assembly StructureMap.dll.

O próximo passo é configurar o StructureMap, para isso vamos criar uma classe:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class StructureMapConfiguration
{
    public static void Configure()
    {
        ObjectFactory.Initialize(InitializeStructureMap);
    }
 
    private static void InitializeStructureMap(IInitializationExpression x)
    {
        x.Scan(y =>
        {
            y.Assembly("MvcApplication1");
            y.With<defaultconventionscanner>();
        });
    }
}

O que fazemos nesse código e dizer para o ScrutureMap buscar no Assembly MvcApplication1 usando a convenção padrão. E o que é a convenção padrão? Geralmente quando criamos uma interface, como no nosso caso criamos a interface IClienteService criamos uma classe com a implementação padrão da interface chamada ClienteService. Essa é a convenção padrão, dessa forma, toda vez que precisarmos de um objeto que implemente a interface IClienteService o StructureMap buscará nos assemblies informados para ele, a classe de mesmo nome só que sem o I. Prático não? Nada de configurar XMLs e afins (embora o StructureMap permita isso).

Outra coisa que precisamos fazer é criar uma classe que será responsável pela criação dos nosso controllers. Isso é necessário porque por padrão o Asp.Net MVC cria os controllers apenas com o construtor padrão, sem parâmetros. Nossa classe fica assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null) return null;
        try
        {
            return ObjectFactory.GetInstance(controllerType) as Controller;
 
        }
        catch (StructureMapException)
        {
 
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
            throw;
        }
    }
}

Pronto, agora vamos alterar a inicialização da aplicação no Global.asax, que deve ficar assim:

?View Code CSHARP
1
2
3
4
5
6
7
protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    StructureMapConfiguration.Configure();
    ControllerBuilder.Current.SetControllerFactory(new
        StructureMapControllerFactory());
}

Uma última coisa, no nosso controller ClienteController tínhamos dois construtores, agora vamos deixar apenas um com o parâmetro necessário para funcionar:

?View Code CSHARP
1
2
3
4
5
public IClienteService _service;
public ClienteController(IClienteService service)
{
    _service = service;
}

Pronto, isso é tudo o que é necessário. Mas se você quiser utilizar um XML para configurar suas classes, é possível. Dentro da classe de configuração, logo abaixo do método Scan, adicione:

?View Code CSHARP
1
x.AddConfigurationFromXmlFile("structuremap.config.xml");

Isso fará que com que o StructureMap procure na raiz do site por um arquivo chamado structuremap.config.xml. Segue um exemplo de como deve ser esse arquivo:

?View Code XML
1
2
3
4
5
6
7
<structuremap mementostyle="Attribute">
  <defaultinstance>
    PluginType="MinhaLibrary.Business.IClasseNegocio, MinhaLibrary.Business"
    PluggedType="MinhaLibrary.Business.ImplementacaoClasseNegocio, MinhaLibrary.Business"
    Scope="Singleton" />
  </defaultinstance>
</structuremap>

É isso! E viva o Convention over Configuration!!!!

Tweet
government,politics news,politics news,politics
Categories: ASPNET MVC | Tags: asp.net mvc, dependency injection, structuremap

Asp.Net MVC e o padrão Dependency Injection

Posted on 22/11/2009 by vintem
2 Comments

O padrão Dependency Injection (DI) é  utilizado para diminuir o acoplamento entre as partes de um sistema.

Vou demonstrar em duas partes como fazer Dependency Injection, na primeira parte vou fazer a injeção de forma manual e depois vou utilizar o framework Structuremap para isso.

Existem algumas razões para se fazer isso, mas na minha opinião as principais são: facilitar a criação de testes unitários e a possibilidade de se estender uma aplicação sem comprometer as partes que dependem do funcionamento daquela aplicação.

Imagine o seguinte cenário:

Cenário de Dependência

No caso acima, temos uma classe ClienteController (já pensando no MVC), que usa/depende uma classe ClienteService, que é a classe responsável por todas as regras de negócio relativas a Cliente mas que usa/depende da classe ClienteRepository, que é a classe responsável por todas as atividades no banco de dados relacionadas a Cliente.

Uma implementação das classes ClienteController e ClienteService poderia ser feita assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class ClienteController : Controller
{
    public ActionResult Novo(Cliente cliente)
    {
        var service = new ClienteService();
        service.Salvar(cliente);
        return View();
    }
}
 
public class ClienteService
{
    public void Salvar(Cliente c)
    {
        if(ValidarCliente(c))
        {
            var rep = new ClienteRepository();
            rep.Salvar(c);
        }
    }
 
    private bool ValidarCliente(Cliente cliente)
    {
        return true;
    }
}

Veja na linha 5 que a classe ClienteController faz uma referência direta à classe ClienteService e na linha 17 a classe ClienteService faz uma referência direta à classe ClienteRepository. Isso não seria um problema se a) você não estiver considerando fazer testes unitários e b) se o seu sistema for um sistema pequeno com poucas classes e que não vá lhe gerar muitos problemas de manutenção.

No caso do teste unitário isso é um problema porque assim que for criado um teste para o método Salvar na classe ClienteController esse teste irá testar toda a sequência de atividades, inclusive as classes de Service e Repository.

Outro problema é o seguinte, imagine que esse é um sistema que você distribui para os seus clientes e que você tem uma outra classe ContasPagarService, a regra de negócio de contas a pagar varia de acordo com cada cliente que você tem. Se o código estivesse com o nível de dependência acima, talvez a única forma (ou a mais comum) de se resolver essa diferença seria implementando uma série de ifs dentro do código da classe de Service.

Como resolver esse problema então? 1o temos que começar quebrando as dependências criando interfaces.  Assim temos:

?View Code CSHARP
1
2
3
4
5
// IClienteService.cs
public interface IClienteService
{
    void Salvar(Cliente c);
}

Depois disso, precisamos alterar as nossas classes para implementar as interfaces:

?View Code CSHARP
1
2
public class ClienteRepository : IClienteRepository
public class ClienteService : IClienteService

Agora já estamos prontos pra fazer um pouco de Dependency Injection.

Vamos começar reconhecendo as dependências em nossas classes, sabemos que a classe Controller depende da classe Service que por sua vez depende da classe Repository. Vamos trocar essas dependências para as interfaces que criamos e teremos a classe ClienteController assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ClienteController : Controller
{
    private IClienteService _service;
    public ClienteController(IClienteService service)
    {
        _service = service;
    }
 
    public ActionResult Novo(Cliente cliente)
    {
        _service.Salvar(cliente);
        return View();
    }
}

Veja que agora a classe ClienteController está esperando qualquer objeto que implemente a interface IClienteService e não temos mais uma dependência direta para a classe ClienteService.

Agora veja como ficou a classe ClienteService:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ClienteService : IClienteService
{
    private IClienteRepository _repository;
    public  ClienteService(IClienteRepository repository)
    {
        _repository = repository;
    }
 
    public void Salvar(Cliente c)
    {
        if(ValidarCliente(c))
        {
            _repository.Salvar(c);
        }
    }
 
    private bool ValidarCliente(Cliente cliente)
    {
        return true;
    }
}

A classe ClienteService ficou muito parecida com a classe ClienteController. Agora ela espera um objeto que implemente a interface IClienteRepository no construtor e depois usa esse objeto nas chamadas do repository.

Agora só falta ligar os pontos. Como dizer para as classes que ClienteController e ClienteService qual objeto elas realmente vão usar.

Para isso vamos utilizar um outro padrão chamado Abstract Factory para centralizar todas as nossas dependências em uma única classe. A nossa classe de abstract factory ficou assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
// MeuProjetoFactory.cs
public class MeuProjetoFactory
{
    public static IClienteService CriaClienteService()
    {
        return  new ClienteService(CriaClienteRepository());
    }
    public  static IClienteRepository CriaClienteRepository()
    {
        return  new ClienteRepository();
    }
}

Como vemos, nessa classe sabemos como criar um objeto de cada interface que precisamos. Qual a vantagem disso? Todas as dependências estão centralizadas em único local, muito mais fácil para dar manutenção, não é?

Agora na nossa classe de Controller, precisamos fazer mais uma modificação:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ClienteController : Controller
{
    private IClienteService _service;
 
    public ClienteController(): this(MeuProjetoFactory.CriaClienteService())
    {
 
    }
 
    public ClienteController(IClienteService service)
    {
        _service = service;
    }
 
    public ActionResult Novo(Cliente cliente)
    {
        _service.Salvar(cliente);
        return View();
    }
}

Pronto, agora toda vez que uma classe ClienteController for criada, se no momento da criação não for informado um IClienteService e for utilizado o construtor padrão, automaticamente iremos buscar da nossa classe de factory.

Isso deve ser feito dessa forma porque o Asp.Net MVC por padrão não consegue criar controllers sem ser pelo construtor padrão.

Pronto, agora já temos um sistema com as nossas camadas bem separadas e utilizando o padrão Dependency Injection.

Agora se quisermos testar a nossa classe ClienteController é só passar uma classe de mock que implemente a interface IClienteService para o construtor.

E no caso que falei sobre as regras de negócio diferentes no contas a pagar? Bom, uma das soluções para isso nesse caso seria ter várias classes que implementassem IContasPagarService por exemplo, ContasPagarCliente1Service, ContasPagarClienteXptoService e assim por diante. Então, dentro do abstract factory, poderíamos ter um método assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
public static IContasPagarService CriaContasPagarService()
{
    switch (ConfigurationManager.AppSettings["Cliente"])
    {
       case "Cliente1":
            return new ContasPagarCliente1Service();
       case "ClienteXpto":
            return new ContasPagarClienteXptoService();
       default:
            return new ContasPagarService();
    }
}

De novo, estamos centralizando tudo na classe de abstract factory e utilizando o web.config para configurarmos qual classe de negócio utilizaremos. Um código bem mais simples e limpo. E ainda, a cada vez que tivermos que mudar uma regra de negócio de um cliente específico, não precisamos nos preocupar se afetamos ou não a regra de negócio de outro.

No próximo post eu vou falar sobre como fazer Dependency Injection de uma forma ainda mais fácil que essa. Espero que nesse ponto pelo menos a teoria esteja clara.

Tweet
government,politics news,politics news,politics
Categories: ASPNET MVC | Tags: asp.net vc, dependency injection

Utilizando o Asp.Net MVC junto com Asp.Net WebForms

Posted on 14/11/2009 by vintem
2 Comments

Para aqueles que como eu, gostaram muito da implementação do MVC para o Asp.Net (eu relutei no início, mas tive que ceder, ficou muito bom) e gostariam de começar a usá-lo já, mas não tem nenhum projeto novo pra implementá-lo, existe uma forma de utilizar o Asp.Net MVC junto com os costumeiros Web Forms.

A 1a coisa que você precisa verificar, obviamente, é se o servidor onde roda o seu site suporta o .Net Framework 3.5, já que o Asp.Net MVC precisa dessa versão.

1) Se o projeto foi feito no Visual Studio 2005 ou 2003, abra ele no Visual Studio 2008 e siga o wizard pra converter o projeto para o Visual Studio 2008.

2) Se o seu projeto for uma web application (que tem a pasta bin) pode pular essa etapa, se for um web site é preciso convertê-lo para um web application. Veja como aqui http://msdn.microsoft.com/en-us/library/aa983476.aspx.

3) Clique com o botão direito na solução, depois em properties. Na aba Application, verifique se o Target Framework está selecionado para .NET Framework 3.5.

4) Adicione as referências para o projeto System.Web.Mvc, System.Web.Abstractions e System.Web.Routing. Elas estão na aba .NET.

5) Nas suas referências selecione os assemblies que você acabou de adicionar, vá na janela propriedades e na propriedade CopyLocal selecione True.

Marcando referências para CopyLocal = true

6) Se você ainda não tiver, crie um arquivo Global.asax

7) Altere seu arquivo Global.asax para que fique assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }
 
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute("Default", "{controller}/{action}/{id}",
            new {action = "Index", id = ""});
    }
}

Nesse momento, estamos apenas adicionando uma rota padrão. Veja que a rota padrão não tem um controller padrão, isso para que quando alguém acessar o seu site sem informar nada na url (ex: www.meusite.com.br), ele seja redirecionado para a página default, geralmente a página default.aspx.
8) Ative o UrlRoutingModule no seu web.config.

?View Code XML
1
2
3
4
5
6
7
<system.web>
  ...
  <httpModules>
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing"/>
  </httpModules>
  ...
</system.web>

9) Na raiz do seu projeto adicione uma pasta Controllers e outra Views.

10) Para ativar os helpers do MVC, as tags <%= Html.* %>, é preciso adicionar uma tagno web.config.

?View Code XML
1
2
3
4
5
6
7
8
9
10
11
<pages>
...
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Linq"/>
        <add namespace="System.Collections.Generic"/>
    </namespaces>
 ...
</pages>

11) Adicione as configurações abaixo na tag pages e na tag controls para que você consiga usar Views tipadas.

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<system.web> 
.. 
    <pages 
        validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, 
        System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, 
        PublicKeyToken=31BF3856AD364E35" 
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, 
        Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
 
        <controls> 
        ... 
            <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
                namespace="System.Web.Mvc" tagPrefix="mvc" /> 
        </controls> 
    ....

Pronto, se você adicionar um Controller HomeController na pasta Controllers com uma action Index, por exemplo, e for na pasta Views, criar uma pasta Home, um arquivo Index.aspx e no code behind da página trocar a classe base de System.Web.UI.Page para System.Web.Mvc.ViewPage, já deve funcionar.

Agora se você quiser que os wizards do Visual Studio para o MVC como o Add -> Controller ou Add -> View, é preciso fazer mais uma coisa.

1) Na janela Solution Explorer, clique com o botão direito em Unload Project.

2) Clique com o botão direito no projeto e em Edit Nome-do-Projeto.csproj

3) Dentro do XML que abriu procure a tag

e adicione o item abaixo na frente dos outros:

{603c0e0b-db56-11dc-be95-000d561079b0};

4) Salve o arquivo, clique com o botão direito no projeto e em Reload Project.

Se der um erro “Unable to read the project file”, clique em OK e depois faça o Reload Project novamente.

Tweet
government,politics news,politics news,politics
Categories: ASP.NET, ASPNET MVC | Tags: asp.net, asp.net mvc
Next Entries
  • Categorias

    • .NET (1)
    • ASP.NET (1)
    • ASPNET MVC (15)
    • Blog (1)
    • Controle de Versões (2)
    • Desenvolvimento (10)
    • Java (1)
    • JavaScript (2)
    • jQuery (1)
    • Leitura (5)
    • Ruby (2)
    • Ruby on Rails (1)
    • Sem categoria (23)
    • Testes (4)
  • Language

    • English
    • Português
  • Tags

    agilidade asp.net asp.net mvc asp.net vc automapper blog code templates controle de versoes css dataaccess dependency injection ebook encoding eventos excecoes firebug git globalizacao hibernate iis ironruby jasypt java javascript jquery json leitura less mvccontrib qcon rails ruby selenium simpledata snippet stored procedures structuremap tdc templates testes testes integrados visualstudio vraptor windsor
© Temple Coding. Proudly Powered by WordPress | Nest Theme by YChong