Code Snippet para TestMethods no VisualStudio

Filed Under (.NET, Boas Práticas, TDD, Visual Studio 2010) by Vinicius Quaiato on 09-03-2010

Tagged Under : ,

Sempre achei um “pé” ter que ficar copiando métodos de teste, tudo pela preguiça de colocar o attribute [TestMethod] public void etc, etc.

Criei um CodeSnippet pra ser usado com C# que resolve alguns desses problemas. Abaixo segue o código do Snippet, à noite eu mostro como inserir o mesmo no VisualStudio, e coloco um link para download também:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Test Method</Title>
      <Shortcut>test</Shortcut>
      <Description>Code snippet to create a test method</Description>
      <Author>Vinicius Quaiato</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>Test_Method_Name</ID>
          <ToolTip>The name of the method. Try using a name that indicates the purpose of the test</ToolTip>
          <Default>Test_Method_Name</Default>
       </Literal>
     </Declarations>
     <Code Language="csharp">
       <![CDATA[	[TestMethod]
	public void $Test_Method_Name$()
	{   
 
	}]]>
     </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Espero que ajude um pouco. É mais rápido digitar “test + tab + tab” do que copiar, colar e alterar o nome do método anterior.

Abraços,
Vinicius Quaiato.

Dynamic Types na .Net Magazine #71

Filed Under (.NET 4.0, Publicações, Visual Studio 2010) by Vinicius Quaiato on 08-03-2010

Tagged Under : , , ,

Capa .NET Magazine #71

Capa .NET Magazine #71

Fala galera!

Foi publicado mais um artigo meu na .Net Magazine, edição 71.

O artigo fala sobre Dynamic Types e mostra alguns cenários de utilização das novas funcionalidades dinâmicas incorporadas ao .Net Framework 4.0.
Uma pequena amostra pode ser conferida aqui: http://www.devmedia.com.br/articles/viewcomp.asp?comp=16159

Esta edição está bem bacana, focando principalmente nas novidades do .Net 4.0 e do Visual Studio 2010. Vale conferir, temos também os seguintes artigos das feras:

 

 

 

 

  • .Net Brasil – Por: Rodrigo Sendin
  • Dynamic types – Por: Vinicius Quaiato
  • Dicas para otimizar o acesso ao SQL Server – Por: Danielle da Silva Monteiro
  • Visual Studio 2010 e .NET 4.0 – Por: Leandro Daniel
  • Criando controles personalizados no ASP.NET – Por: Thomas Alexander
  • SharePoint – Por: Braian Takahira
  • Produtividade com T4 – Por: Rodrigo Sendin
  • Desenvolvimento Desktop no .NET – Por: Everton Coimbra de Araújo
  • ASP.NET e ADO.NET – Por: Erysson Batista Barros de Souz

Deve chegar nas bancas nos próximos dias!

Por favor dêem seu feedback, é realmente muito importante!

Abraços,
Vinicius Quaiato.

PLINQ: Paralelismo no .Net 4 com Parallel LINQ

Filed Under (.NET 4.0, Visual Studio 2010) by Vinicius Quaiato on 24-02-2010

Tagged Under : , , ,

Fala galera. Vou abordar um pouco do PLINQ neste post.

Parallel LINQ, ou PLINQ, é uma implementação do padrão LINQ que trabalha de forma paralela sobre qualquer fonte de dados em memória que implemente IEnumerable ou IEnumerable<T>, possuindo ainda a execução adiada até o momento em que a query é enumerada, ou seja, de fato utilizada.

Umas das novidades é o extension AsParallel que está disponível em IEnumerable e IEnumerable<T>. AsParallel diz que à partir daquele momento as operações realizadas sobre aquela fonte de dados serão executas de forma paralela, é bem simples. O código abaixo demonstra isso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Main(string[] args)
{
    var numeros = Enumerable.Range(0, 10);
 
    var dobrados = from n in numeros.AsParallel()
                   select Dobro(n);
 
    foreach (var dobro in dobrados)
        Console.WriteLine(dobro);
 
    Console.ReadKey();
}
 
private static int Dobro(int numero)
{
    Thread.Sleep(500);
    return numero * 2;
}

Como vemos na linha 5 estamos chamando o método AsParallel na nossa coleção de números. Então apenas chamamos um método passando o número como parâmetro. Este método apenas congela a thread por meio segundo para que possamos notar como os valores são executados de forma paralela. Na imagem abaixo temos o resultado:

Enumerando com AsParallel do PLINQ

Enumerando com AsParallel do PLINQ

O PLINQ também permite de forma simples e fácil especificar quantos processadores queremos utilizar para executar as operações paralelas. É possível especificar até um máximo de 64 processadores (ô loco meu!).
Abaixo segue a alteraçãono código anterior especificando 2 processadores a serem utilizados (só tenho 2):

5
6
    var dobrados = from n in numeros.AsParallel().WithDegreeOfParallelism(2)
                   select Dobro(n);

Na linha 5 do nosso código adicionamos uma chamada para a extensão WithDegreeOfParallelism e passamos como parâmetro o total de processadores a ser utilizado. No mais o código permanece exatamente igual.

Outro recurso bastante interessante é realizar o processamento paralelo e conseguir que o resultado seja ordenado. Isso é possível utilizando a extension AsOrdered.
No código anterior poderíamos utilziar AsParallel e continuar realizando o processamento de forma paralela mas mantendo a saída ordenada, como pode ser visto abaixo:

5
6
    var dobrados = from n in numeros.AsParallel().AsOrdered()
                   select Dobro(n);

A saída pode ser vista na imagem abaixo:

PLINQ usando AsParallel com AsOrdered

PLINQ usando AsParallel com AsOrdered

Existem ainda diversos recursos no PLINQ. Em breve abordarei mais sobre eles aqui.
Uma boa documentação está disponível no MSDN aqui, aqui e aqui.

Comentários, críticas e sugestões, basta escrever.

Att,
Vinicius Quaiato.

Visual Studio 2010 RC lançado

Filed Under (.NET 4.0, Visual Studio 2010) by Vinicius Quaiato on 18-02-2010

Tagged Under : , ,

vs2010 logoFala galera!
Dia 10 de fevereiro, se não me engano, tivemos a liberação da versão RC (Release Candidate) do Visual Studio 2010 para download.

O link para download é este: http://www.microsoft.com/downloads/details.aspx?FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a&displaylang=en

Você pode obter mais informações sobre esta versão aqui: http://msdn.microsoft.com/pt-br/vstudio/dd582936.aspx

Algumas informações (comentários, bugs e melhorias) podem ser vistas aqui no blog do Scott Guthrie.

Estou preparando mais alguns posts sobre funcionalidades do VS2010, e logo mais estarão por aqui.

É isso, espero que utilizem, dêem seu feedback, e se divirtam!

Att,
Vinicius Quaiato.

Entity Framework 4 – Model First com POCOs

Filed Under (.NET, .NET 4.0, Boas Práticas, Entity Framework, Visual Studio 2010) by Vinicius Quaiato on 27-01-2010

Tagged Under : , ,

Fala galera, de buenas? Resolvi escrever um pouco sobre o Entity Framework 4.0 (na verdade é a versão 2 do EF mas para acompanhar o .NET 4.0 ele será chamado assim também).

Hoje vou mostrar uma característica bem interessante, que é o model first trabalhando com POCOs.
Model First diz respeito a primeiro criar suas entidades, ou seja, suas classes, e somente depois modelar o banco de dados – e é isto que queremos fazer quando desenvolvemos aplicações usando Orientação a Objetos, não é?
POCOs são classes simples, que não herdam nem implementam nenhuma outra classes/interface específica de frameworks, dizendo respeito exclusivamente ao nosso domínio e contendo apenas o necessário ao nosso domínio.

Para começar vamos criar um projeto de testes e adicionar um arquivo .edmx como mostra a figura abaixo:



Feito isso vamos selecionar o tipo de modelo “empty model”:

Selecionando o empty model

Selecionando o empty model


Pronto!
Vamos então adicionar duas entidades ao nosso design surface. Estas serão nossas entidades POCO, ou seja, não terão nenhuma dependência do Entity Framework, nem do Linq, nem de nada, é apenas o nosso modelo de classes, vamos ainda desabilitar a geração de código do Visual Studio, para que ele não “polua” as classes:


E então clicamos na parte branca do design e abrimos a janela de propriedades para desabilitar a geração de código:


Estamos a meio caminho andado. Pode parecer muito trabalho a ser feito, mas isso não leva mais do que 2 minutos. É realmente simples e os resultados são muito bons.
Agora vamos para a parte bacana, codificar nossas classes.
Vamos iniciar codificando as classes Pedido e ItemPedido, que são classes realmente bastante simples:

public class Pedido
{
    public virtual int Id { get; set; }
    private IList<ItemPedido> itens = new List<ItemPedido>();
    public virtual IList<ItemPedido> Itens
    {
        get { return this.itens; }
        set { this.itens = value; }
    }
}
 
public class ItemPedido
{
    public virtual int Id { get; set; }
    public virtual string Produto { get; set; }
    public virtual int Quantidade { get; set; }
    public virtual Pedido Pedido { get; set; }
}

Os virtuais que usamos nas nossas classes são para que o Entity Framework possa fazer o “tracking” dos nossos objetos. Internamente ele criará proxies para nossas classes. Em um primeiro momento basta colocarmos as propriedades como virtual e ele se encarregará de tudo, isso ainda ajudará no Lazy Loading.

Agora, como desabilitamos a geração de código, precisamos também criar o nosso contexto do EF. Isso é bastante simples, e neste cenário nos obrigará a escrever apenas umas 10 linhas de código, como pode ser visto abaixo:

public class EF4Context : ObjectContext
{
    public EF4Context()
        : base("name=EF4Container", "EF4Container") { }
 
    private IObjectSet<Pedido> pedidos;
    public IObjectSet<Pedido> Pedidos
    {
        get
        {
            if (pedidos == null)
                pedidos = CreateObjectSet<Pedido>();
 
            return pedidos;
        }
    }
}

Feito isso nos resta apenas gerar o banco de dados. Como dissemos, geramos primeiro nossas classes, sem nos preocupar em como estes dados seriam armazenados, conseguimos focar puramente no nosso domínio e no nosso modelo, afinal estamos pensando em classes e objetos, e não em linhas/tuplas de banco, chaves, índices, etc.
O Visual Studio irá gerar o código necessário para nosso banco de dados veja abaixo:


Agora é só executar o SQL gerado:


Se vocês fizeram tudo certinho até o momento, devem ser capazes de executar os seguintes códigos de testes com sucesso:

[TestMethod]
public void Deve_Adicionar_Um_Pedido_No_DB_Usando_Contexto_E_Poco()
{
    var contexto = new EF4Context();
 
    var pedido = new Pedido();
 
    pedido.Itens.Add(new ItemPedido
    {
        Produto = "Novo Produto",
        Quantidade = 5,
        Pedido = pedido
    });
 
    contexto.AddObject("PedidoSet", pedido);
    contexto.SaveChanges();
}

Depois este:

[TestMethod]
public void Deve_Obter_Todos_Os_Pedidos_Do_Banco_Usando_Contexto_E_Pocos()
{
    var contexto = new EF4Context();
 
    var pedidos = contexto.Pedidos.ToList();
 
    Assert.IsTrue(pedidos.Count > 0);
}

E por fim este:

1
2
3
4
5
6
7
8
9
10
11
12
13
[TestMethod]
public void Deve_Selecionar_1_Pedido_Do_Banco_Usando_Contexto_E_Pocos()
{
    var contexto = new EF4Context();
    contexto.ContextOptions.LazyLoadingEnabled = true;
 
    var pedido = contexto.Pedidos
                            .Where(p => p.Id == 1).Single();
 
    Assert.AreEqual(1, pedido.Id);
    Assert.IsTrue(pedido.Itens.Count > 0);
    Assert.AreEqual("Novo Produto", pedido.Itens[0].Produto);
}

Percebam como na linha 5 habilitamos o lazy loading para que as propriedades sejam carregadas no momento em que forem chamadas apenas.

E se fizermos uma consulta no banco de dados, veremos que de fato os dados estão lá:


Bom pessoal, é isso.
Esta é uma das funcionalidades presentes no Entity Framework 4.0. É claro que existe muita coisa a ser explorada ainda, e existem muitas coisas a serem feitas ainda, mas é um enorme avanço poder trabalhar com POCOs e utilizar os recursos de uma ferrmenta ORM como o EF. Poder dar “tchau” para os SqlConnection, SqlCommand, ExecuteScalar, etc, é algo realmente incrível.

Espero que tenham gostado. Dúvidas, críticas e sugestões me enviem email ou comentários.

Abraços,
Vinicius Quaiato.

ASP.NET MVC + JQuery

Filed Under (.NET, ASP.NET, ASP.NET MVC, Visual Studio 2010) by Vinicius Quaiato on 25-01-2010

Tagged Under : , , , ,

Neste artigo mostrarei um pouco de como usar o ASP.NET MVC com o Jquery para criar páginas mais dinâmicas e funcionais.

Este não é um artigo introdutório ao ASP.NET MVC, posso escrever sobre isso depois, e você pode encontrar tudo sobre o MVC do asp.net aqui: http://www.asp.net/mvc/.

Neste exemplo estou utilizando o VS2010 beta 2, Asp.Net MVC 2 e Jquery 1.3.2. Também utilizarei o plugin DataTables para o Jquery, que você deve baixar aqui: http://datatables.net/

Primeiramente vamos criar um website do tipo Asp.Net MVC no VS2010. Feito isso eu vou excluir todas as Views e Controllers que são criados por padrão, mantendo apenas os configs e a pasta Scripts.

Agora vamos criar um Controller para retornar uma lista de objetos, para que possamos montar um grid e executar algumas ações. Vou criar um Controller chamado HomeController, e adicionar o código abaixo:

public ActionResult Index()
{
    var items = new List<ExpandoObject>();
    for (int i = 0; i < 10; i++)
    {
        dynamic item = new ExpandoObject();
        item.Id = i + 1;
        item.Nome = string.Format("Item {0}", i + 1);
        item.Valor = 10 + i;
        item.Descricao = string.Format("Descricao do Item {0}", i + 1);
 
        items.Add(item);
    }
 
    ViewData["items"] = items;
    return View();
}

O código é bastante simples, cria apenas uma lista de ExpandoObjects e manda esta lista para a View(leia mais sobre ExpandoObjects aqui).

Agora crie uma pasta chamada Home dentro da pasta Views e então crie uma View chamada Index dentro da pasta Home, a solution deve ficar assim:

Solution com View e Controller

Solution com View e Controller

Vamos para o código .aspx da nossa View que deve ficar assim:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>HomeView</title>
</head>
<body>
    <div>
        <table id="dataTable">
            <thead>
                <tr style="background-color:#aabbcc; color:#fff;">
                    <th style="width: 50px;">
                        Id
                    </th>
                    <th style="width: 100px;">
                        Nome
                    </th>
                    <th style="width: 70px;">
                        Preço
                    </th>
                    <th style="width: 200px;">
                        Descrição
                    </th>
                </tr>
            </thead>
            <tbody>
                <%
                    var items = ViewData["items"] as List<System.Dynamic.ExpandoObject>;
                    foreach (dynamic item in items)
                    {
                %>
                <tr id="<%=item.Id %>">
                    <td>
                        <%=item.Id %>
                    </td>
                    <td>
                        <%=item.Nome %>
                    </td>
                    <td>
                        R$
                        <%=item.Valor.ToString("N2") %>
                    </td>
                    <td>
                        <%=item.Descricao %>
                    </td>
                </tr>
                <%} %>
            </tbody>
        </table>
    </div>
</body>
</html>

Tudo que este código faz é obter nossa lista de items e então desenhá-los na tela em forma de uma tabela.
Agora vamos usar o Jquery para ir até o servidor, excluir um item da lista no servidor, e então removê-lo da lista no client utilizando Ajax.

Para isso incluiremos uma referência para o Jquery em nossa View. O Jquery já vem junto com os projetos MVC do asp.net em sua versão 2, basta arrastar o arquivo da pasta Scripts para dentro da View que a referência é adicionada:

<head id="Head1" runat="server">
    <title>HomeView</title>
    <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"></script>
</head>

Agora vamos criar uma function javascript que fará a chamada via Ajax para o Controller:

1
2
3
4
5
6
7
8
9
10
function Remover(action, param) {
    $.post(action + "/" + param,
    function (data) {
        alert(data);
 
        $("#" + param).fadeOut("slow");
    });
 
    return false;
}

Esta function recebe 2 parâmetros, o primeiro é o nome da Action que executaremos no Controller, e o segundo é o parâmetro que passaremos, nesse caso o id do nosso item.
A linha 2 utiliza uma função do Jquery para fazer chamas Ajax usando post. O primeiro parâmetro é a url a ser chamada, no nosso exemplo será algo como “remover/5″. O segundo parâmetro é uma function de callback, que será executada depois que a resposta vier do servidor, e o que estamos fazendo é exibindo a resposta, e então removendo da nossa tabela a linha excluída, utilizando uma animação do Jquery chamada fadeOut.

No nosso Controller adicionaremos um método para simular a exclusão do item, como pode ser visto abaixo:

[AcceptVerbs(HttpVerbs.Post)]
public string Remover(int id)
{
    return string.Format("removeu item: {0}", id);
}

Tudo que esta Action faz é retornar uma string dizendo que o item foi removido.
Agora precisamos fazer com que exista um link na nossa tabela para executar esta ação, e para isso incluiremos mais uma coluna, a coluna Ação, e este código será necessário para renderizar os dados:

<td>
    <a href="remover/<%=item.Id %>" onclick="return Remover('remover','<%=item.Id %>')">
        Remover</a>
</td>

Pronto! Agora já temos uma tabela capaz de excluir itens usando Ajax e ainda ter a linha removida da tabela utilizando um efeito bem bacana.

E para deixar as coisas um pouco mais “profissionais” vamos deixar esta tabela com cara e comportamente de grid, usando o plugin DataTables.
Para isso inclua o arquivo jquery.dataTables.js que você baixou dentro da pasta Scripts, e então arraste o mesmo até a View, para incluir a referência.
Agora coloque o seguinte código javascript dentro do da sua view:

$(document).ready(function () {
    $("#dataTable").dataTable();
});

Este código irá aplicar o plugin na nossa tabela, e o resultado será como mostrado abaixo:

table usando plugin DataTables

table usando plugin DataTables

Agora podemos filtrar, ordenar e paginar nossos dados, sem nenhum esforço adicional, veja um exemplo de filtro abaixo:

plugin DataTable filtrando dados

plugin DataTable filtrando dados

Bom galera, é isso!
O código fonte desta solução está disponível aqui.

Qualquer dúvida, email ou comentários.

Abraços,
Vinicius Quaiato.

DynamicObject: dinamismo no .NET 4.0

Filed Under (.NET, .NET 4.0, Visual Studio 2010) by Vinicius Quaiato on 23-12-2009

Tagged Under : , , , ,

Continuando a falar de dynamic no .NET 4.0, vamos falar um pouco sobre DynamicObject.

DynamicObject é uma classe abstrata que permite definir quais operações podem ser feitas em um objeto dynamic e como estas operações são realizadas.

Falei um pouco sobre ExpandoObject aqui, que é um tipo de objeto dynamic.

Para não dizer que esta é uma das novas features e que ela é inútil, estou envolvido em um projeto e se esta feature já estivesse disponível em versão realease, eu já estaria utilizando a mesma por necessidades do projeto.

Bom para dar um exemplo, vamos imaginar que estamos implementando um provider customizado para sessões em nossa aplicação.
Muitas vezes não queremos ter que escrever algo como minhaSessao["Usuario"], afinal se sabemos que sempre haverá um Usuario na sessão ele poderia ser uma propriedade. Com DynamicObject podemos fazer isso (primeiro vou escrever os testes):

[TestMethod]
public void Deve_Criar_Uma_Propriedade_Nome_No_Objeto_Dinamico()
{
    dynamic sessaoDinamica = new SessaoDinamica();
    sessaoDinamica.Nome = "Vinicius";
 
    Assert.AreEqual(sessaoDinamica.Nome, "Vinicius");
}

E a classe SessaoDinamica:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SessaoDinamica : DynamicObject
{
    private Dictionary<string, object> sessionItems = new Dictionary<string, object>();
 
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        sessionItems[binder.Name.ToLower()] = value;
 
        return true;
    }
 
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return sessionItems.TryGetValue(binder.Name.ToLower(), out result);
    }
}

Podemos notar na linha 1 que nossa classe herda de DynamicObject, que como foi dito é uma classe abstrata.
Na linha 3 definimos um dicionário para ser a coleção de itens da nossa sessão.
Nas linhas 5 a 10 fazemos um override em um dos métodos da classe DynamicObject. O método TrySetMember é que fará toda a mágica. Quando uma propriedade for chamada no objeto dynamic o .net irá verificar se esta propriedade existe de fato e caso ela não exista o método TrySetMember será então chamado. Dentro deste método estamos atribuindo o nome da propriedade chamada à uma chave do nosso dicionário, e o valor que foi atribuído a ela para o valor do item do dicionário.
Pronto! Com isso já é possível chamar qualquer propriedade na nossa sessão.
Nas linhas 13 a 15 fazemos o mesmo mas para um get. Sempre que tentar obter um valor de uma propriedade em um objeto dynamic o .net irá verificar se a propriedade existe, e caso não exista será chamado o método TryGetMember.

Com isso podemos executar o código do teste abaixo:

1
2
3
4
5
6
7
8
9
10
[TestMethod]
public void Deve_Criar_Uma_Propriedade_Nome_E_outra_Sobrenome()
{
    dynamic sessaoDinamica = new SessaoDinamica();
    sessaoDinamica.Nome = "Vinicius";
    sessaoDinamica.Sobrenome = "Quaiato";
 
    Assert.AreEqual(sessaoDinamica.Nome, "Vinicius");
    Assert.AreEqual(sessaoDinamica.sobrenome, "Quaiato");
}

Nas linhas 5 e 6 estamos setando duas propriedade que “não existem” definidas na nossa classe SessaoDinamica, mas o TrySetMember está fazendo a mágica “por baixo dos panos”.
E nas linhas 8 e 9 estamos obtendo o valor das duas propriedades e o TryGetMember está fazendo a mágica também.
Note que na linha 9 usamos a propriedade com letra minúscula, podendo trabalhar com elas de modo case-sensitive ou case-insensitive.

É isso galera.
Tenho certeza que as capacidades dinâmicas do .net 4 irão fornecer base para muitos trabalhos interessantes, tanto em projetos na comunidade quanto em projetos particulares.

Qualquer dúvida é só postar aqui ou escrever um email.

Abraços,
Vinicius Quaiato.

ExpandoObject: dinamismo no .NET 4.0

Filed Under (.NET, .NET 4.0, Visual Studio 2010) by Vinicius Quaiato on 15-12-2009

Tagged Under : , , , ,

Fala galera, hoje vamos falar um pouco sobre dynamic no .NET 4.0.

Dynamic é um novo tipo introduzido no .net framework 4.0, é um tipo estático assim como os outros tipos do framework, no entanto ele ignora as verificações estáticas em tempo de compilação.
Deve-se prestar atenção, então, aos erros que podem acontecer em runtime, pois um código que não existe e seja chamado gerará um erro em tempo de execução.

Alguns podem achar que isso é um problema, esse papo todo de runtime e etc, eu já não enxergo desta maneira, vejo como uma oportunidade para novas criações.
Diversas empresas e projetos que trabalham com .net se deparam em situações onde a equipe diz:
“Ah se isso fosse diferente… Poderíamos fazer de forma mais simples ou legível…”.
Isso não é uma coisa ruim, é um sinal de que em algumas situações necessitamos de algo mais dinâmico do que o que o .net proporciona (proporcionava) até então.

Bom vamos falar um pouco do ExpandoObject.
ExpandoObject é um objeto que pode ter membros adicionados ou removidos dinâmicamente. Com ele é possível definirmos métodos e propriedades em tempo de execução.
Talvez muitos de nós não vejamos vantagens neste tipo de feature logo de início, mas para muitos será uma feature muito interessante e que proporcionará um grande avanço.

Vamos imaginar o seguinte cenário para a utilização do ExpandoObject:
Um sistema consome diversos webservices de empresas distintas de um mesmo segmento, porém, para cada usuário do sistema configuramos uma permissão diferente aos serviços oferecidos por estes webservices.
Vejamos um código de exemplo (lembrando que você precisa do Visual Studio 2010 beta 2).

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Dynamic;
 
namespace ExpandoObjectApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic objetoDinamico = new ExpandoObject();
            dynamic Sistema1 = new ExpandoObject();
            dynamic Sistema2 = new ExpandoObject();
 
            Sistema1.PodeAcessar = false;
            Sistema1.AlgumaAcao = (Func<string>)(() =>
            {
                if (Sistema1.PodeAcessar)
                    return "AlgumaAcao no Sistema1";
                else
                    return "Você não pode acessar este serviço";
            });
            objetoDinamico.Sistema1 = Sistema1;
 
            Sistema2.PodeAcessar = true;
            Sistema2.OutraAcao = (Func<int>)(() =>
            {
                if (Sistema2.PodeAcessar)
                    return 1 + 1;
                else
                    throw new Exception("Você não pode acessar este serviço");
            });
            objetoDinamico.Sistema2 = Sistema2;
 
            Console.WriteLine("objetoDinamico.Sistema1.AlgumaAcao: {0}", objetoDinamico.Sistema1.AlgumaAcao());
 
            Console.WriteLine("objetoDinamico.Sistema2.OutraAcao: {0}", objetoDinamico.Sistema2.OutraAcao());
 
            Console.ReadKey();
        }
    }
}

Na linha 2 incluímos uma referência para System.Dynamic, necessário para utilizar o ExpandoObject.
nas linhas 10, 11 e 12 criamos 3 objetos dynamic do tipo ExpandoObject. O primeiro objeto será nosso objeto de permissões. Os objetos Sistema1 e Sistema2 serão cada um a permissão e o acesso ao serviço de terceiros.
Na linha 14 nós criamos uma propriedade em Sistema1 e setamos o seu valor para false.
Nas linhas 15 a 21 estamos definindo um método para o objeto Sistema1. Este método verifica se a propriedade PodeAcessar está com o valor true e então executa o corpo do método.
Na linha 22 dizemos que a propriedade Sistema1 do objeto objetoDinamico é do tipo ExpandoObject, e setamos o seu valor atribuindo a ela o objeto Sistema1.
Nas linhas 24 a 32 fazemos as mesmas coisas para o objeto Sistema2.

O resultado pode ser conferido na imagem a seguir:

Resultado ExpandoObject

Resultado ExpandoObject

Uma das desvantagens para quem está acostumado com o Visual Studio é que os objetos dynamic não possuem intellisense. Talvez isso não seja algo ruim, ou talvez seja, depende bastante do cenário em que é utilizado.

Dynamic object intellisense

Dynamic object intellisense

É isso galera, um outro exemplo do uso de ExpandoObject pode ser visto aqui.

Att,
Vinicius Quaiato.

Silverlight 4 beta – Novas Features – Acessando Arquivos

Filed Under (.NET, Silverlight, Visual Studio 2010) by Vinicius Quaiato on 26-11-2009

Tagged Under : , ,

Fala galera, beleza?

Silverlight 4 – Capturando WebCam – http://viniciusquaiato.com/blog/index.php/silverlight-4-capturando-webcam/

Vamos falar mais um pouco do silverlight 4 beta, desta vez vamos acessar arquivose pastas da máquina utilizando uma aplicação Silverlight rodando fora do browser (Out of Browser).

Vamos abrir o Visual Studio 2010 beta 2 e criar uma nova aplicação Silverlight:



Criando projeto Silverlight

Criando projeto Silverlight (ampliar)

A interface utilizada será bem simples como mostra a imagem e o código XAML abaixo:



Interface Silverlight

Interface Silverlight

Código XAML:

<UserControl x:Class="OutOfBrowserFileAccess.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="335" d:DesignWidth="295" Background="Black">
    <Border CornerRadius="20" Background="Black" Width="305" Height="320">
        <Grid x:Name="LayoutRoot" Background="Black" Height="303" Width="287">
            <ListBox Height="103" HorizontalAlignment="Left"
                     Margin="12,12,0,0" Name="listBox1" 
                     VerticalAlignment="Top" Width="263" />
            <Button  Foreground="Black" FontFamily="Verdana" 
                     FontSize="14" Content="Listar" Height="23" 
                     HorizontalAlignment="Left" Margin="12,121,0,0" 
                     Name="btnListar" VerticalAlignment="Top" 
                     Width="263" Click="btnListar_Click" />
            <Button Content="Gravar Arquivo" Height="23" 
                    HorizontalAlignment="Left" Margin="12,261,0,0"
                    Name="btnGravar" VerticalAlignment="Top" 
                    Width="263" Click="btnGravar_Click" />
            <TextBox Height="80" HorizontalAlignment="Left" 
                     Margin="12,175,0,0" Name="txtConteudoArquivo" 
                     VerticalAlignment="Top" Width="263" 
                     AcceptsReturn="True" />
        </Grid>
    </Border>
</UserControl>

Feito isso vamos implementar agora a listagem dos arquivos da pasta “Documents”, como mostra a listagem do click do primeiro botão abaixo:

1
2
3
4
5
6
7
8
9
private void btnListar_Click(object sender, RoutedEventArgs e)
{
    var files = Directory.EnumerateFiles(
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
                );
 
    foreach (var item in files)
        this.listBox1.Items.Add(item);
}

As linhas 3, 4 e 5 são as principais nesta listagem. Nelas estamos obtendo os nomes dos arquivos do diretório “Meus Documentos”. Notem a utilização das classes Environment e Directory.
Já nas linhas 7 e 8 estamos apenas adicionando os nomes dos arquivos à nossa ListBox.

A listagem a seguir mostra como fazer a gravação de um arquivo texto também na pasta “Meus Documentos”:

1
2
3
4
5
6
7
8
9
10
11
12
private void btnGravar_Click(object sender, RoutedEventArgs e)
{
    var streamWriter = File.CreateText(
            System.IO.Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Silverlight.txt")
            );
 
    streamWriter.WriteLine("Arquivo gerado pela app Silverlight...");
    streamWriter.WriteLine("=======================================");
    streamWriter.WriteLine(this.txtConteudoArquivo.Text);
    streamWriter.Close();
}

Este também é um código bem simples. Na linha 3 estamos criando uma stream para a gravação de um arquivo, novamente utilizando a classe Environment (linha 4).
Nas linhas 7, 8 e 9 gravamos o conteúdo do arquivo, e na linha 10 finalizamos nossas operações.

Para que nossa aplicação rode fora do browser, vamos realizar esta configuração no projeto silverlight, como mostram as imagens abaixo:



Configurando Silverlight Fora do Browser

Configurando Silverlight Fora do Browser



Configurando Silverlight Fora do Browser 2

Configurando Silverlight Fora do Browser 2

Agora é preciso instalar nossa aplicação. Para isso basta iniciar a mesma, com F5 no Visual Studio. Quando a página abrir, basta clicar com o botão direito na página, como mostra a imagem abaixo:



Instalando Aplicacao Silverlight Fora do Browser

Instalando Aplicação Silverlight Fora do Browser



Instalando Aplicacao Silverlight Fora do Browser 2

Instalando Aplicação Silverlight Fora do Browser 2

E como resultado temos:



Aplicacao Silverlight rodando fora do browser

Aplicacao Silverlight rodando fora do browser

E aqui podemos ver o arquivo gerado:



Arquivo gerado pelo silverlight

Arquivo gerado pelo silverlight

Bom é isso aê pessoal.
Quem quiser a solução Silverlight + C# pode ser baixada aqui.

Qualquer dúvida, é só entrar em contato.

Abraços,
Vinicius Quaiato.

Silverlight 4 beta – Novas Features – Capturando Webcam

Filed Under (.NET, Silverlight, Visual Studio 2010) by Vinicius Quaiato on 21-11-2009

Tagged Under : , , , , ,

Fala galera, beleza?

Dia 18 a Microsoft anunciou o Silverlight 4 beta, no PDC09. De fato existem muitas features novas nesta versão do Silverlight e uma destas novas features é a captura de Webcam (todas as informações podem ser vistas aqui), e vamos realizar aqui um exemplo básico, baseado no vídeo do Tim Heuer que pode ser visto aqui.

Antes de começarmos vamos instalar as ferramentas necessárias:

Visual Studio 2010 beta 2 - http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx
ou
Visual Web Developer Express beta 2 – http://go.microsoft.com/fwlink/?LinkID=167874

Microsoft Expression Blend para .NET 4 – http://go.microsoft.com/fwlink/?LinkId=169446

Silverlight Beta Tools para Visual Studio 2010 – http://go.microsoft.com/fwlink/?LinkID=177508

Vamos lá pessoal, vamos começar.

Primeiro vou abrir o Blend e então criar um novo projeto silverlight, como mostra a figura abaixo:



Criando projeto Silverlight Blend 4

Criando projeto Silverlight Blend 4 (ampliar)

Agora vamos criar uma página bem simples, o resultado pode ser visto na imagem abaixo e logo em seguida o código XAML necessário:



Resultado da pagina XAML

Resultado da pagina XAML (ampliar)

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="Teste_com_webcam.MainPage"
	Width="640" Height="480">
 
	<Grid x:Name="LayoutRoot" Background="White">
		<Grid.RowDefinitions>
			<RowDefinition  Height="1*" />
			<RowDefinition Height="7*" />
			<RowDefinition Height="1*" />
		</Grid.RowDefinitions>
 
		<TextBlock Grid.Row="0" FontSize="40" HorizontalAlignment="Center">Webcam</TextBlock>
 
		<Border Background="Black" Grid.Row="1" Width="500" Height="350" CornerRadius="20">
			<Rectangle x:Name="WebCam" Grid.Row="1" Width="480" Height="330"></Rectangle>
		</Border>
 
		<Button x:Name="btnStart"
				Content="Iniciar" 
				Grid.Row="2" 
				Width="100" 
				FontSize="20" />
	</Grid>
</UserControl>

Agora podemos abrir o projeto silverlight no Visual Studio 2010 para que possamos editar o código, conforme mostra a figura abaixo:



Abrir projeto Silverlight no Visual Studio

Abrir projeto Silverlight no Visual Studio (ampliar)

Agora vamos adicionar o código necessário para que nossa webcam seja capturada. Vamos abrir o arquivo MainPage.xaml.cs e então criar o seguinte código:

CaptureSource captureSource = null;
private void Initialize()
{
    var videoDevice = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices()[0];
 
    if (captureSource == null)
        captureSource = new CaptureSource();
 
    captureSource.VideoCaptureDevice = videoDevice;
}

Neste código estamos criando um objeto CaptureSource que será responsável por realizar a nossa captura da webcam.
Na linha 4 pegamos o device de captura de vídeo disponível. Como eu só tenho uma webcam, eu vou pegar o primeiro device.
Na linha 9 eu atribuo o meu device para a propriedade de video device do objeto CaptureSource.

Agora precisamos “pintar” nossa webcam dentro da área onde ela será exibida, no nosso caso um simples retângulo no nosso XAML:

private void FillCamera()
{
    var videoBrush = new VideoBrush();
    videoBrush.SetSource(captureSource);
 
    WebCam.Fill = videoBrush;
}

O que fazemos no código acima é criar um VideoBrush que irá utilizar nosso CaptureSource. Então preenchemos nosso rectangle com o videoBrush. Bem simples.

Até agora se rodarmos nosso código nada acontecerá, pois a mágica acontece neste método:

private void StartCamera()
{
    if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess())
    {
        if (captureSource.State != CaptureState.Started)
            captureSource.Start();
    }
}

Tudo o que fazemos aqui é dizer ao Silverlight para pedir permissão para usar a câmera com o RequestDeviceAccess().
Depois executamos o comando Start() dentro do nosso captureSource, e neste momento o Silverlight irá pedir permissão para o usuário do site e então irá iniciar a exibição do vídeo.

Agora precisamos apenas fazer a chamada para os nossos métodos.
Vamos criar um evento para nosso botão iniciar, para isso faremos uma alteração no contrutor da nossa página e criaremos um método para responder ao evento click do botão, conforme mostrado abaixo:

public MainPage()
{
    InitializeComponent();
    btnStart.Click += new RoutedEventHandler(btnStart_Click);
}
void btnStart_Click(object sender, RoutedEventArgs e)
{
    Initialize();
    FillCamera();
    StartCamera();
}

E podemos ver o resultado nas imagens abaixo:



Silverlight pedindo permissao para usar webcam

Silverlight pedindo permissao para usar webcam (ampliar)



Resultado Webcam com silverlight 4

Resultado Webcam com silverlight 4 (ampliar)

É isso aê pessoal, qualquer dúvida é só entrar em contato.
Em breve postarei mais informações sobre a nova versão do silverlight.

Att,
Vinicius Quaiato.