Consultando desempenho da maquina com o PerformanceCounter

Com o PerformanceCounter podemos obter diversas informações sobre o desempenho atual da maquina, como por exemplo quantidade de memória em uso, espaço livre no HD, processamento, etc.

Quando precisamos rodar um processo muito pesado em um servidor  através de um serviço  periódico muitas vezes vale a pena conferir a situação da maquina antes de iniciar o processo para evitar travamento do sistema. Ou ate mesmo utilizar essas  informações para criar um monitorador dos recursos, vai da sua necessidade e criatividade.

Vamos para o que interessa.

Para pegar informações básicas sobre o uso de memória, hd e processador é muito simples, basta utilizar os seguintes comandos:

 

?View Code CSHARP
1
2
3
4
5
6
7
var cpu = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total");
var memory = new System.Diagnostics.PerformanceCounter("Memory", "% Committed Bytes In Use");
var hd = new System.Diagnostics.PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
 
Console.WriteLine(" % Uso do Processador: {0}", cpu.NextValue());
Console.WriteLine(" % Uso de Memória: {0}", memory.NextValue());
Console.WriteLine(" % Acesso ao HD: {0}", hd.NextValue());

Para mais informações http://msdn.microsoft.com/pt-br/library/system.diagnostics.performancecounter.aspx

Até a próxima.
[]s

Utilizando MSMQ (Microsoft Message Queue) no C#

MSMQ (Microsoft Message Queue) é uma implementaçao da Microsoft presente desde o windows 95 para  o enfileiramento de Mensagens.

As filas trabalham com a politica  FIFO (First In First Out), ou seja, em uma fila podemos empilhar uma serie de mensagens, e sempre sera recuperado uma a uma começando pela ultima que foi inserida.

O MSMQ trabalha de forma assincrona, possibilitando que diferentes aplicaçoes comuniquem-se por meio de mensagens, o software envia as mensagens que serão empilhadas em uma fila gerenciada pelo proprio windows até que o programa receptor va até la pegar as mensagens.

Tipos de Filas

No MSMQ podemos criar filas Publicas ou Privadas. As filas publicas podem ser acessadas apartir de qualquer computador que faça parte do mesmo Dominio atravez do Active Directory, já as filas privadas são compartilhadas somente com os programas rodando na mesma maquina.

Transacional

Tambem podemos definir a fila como transacional ou não, protegendo a inserçao e remoçao de mensagens em casos de erros.

 

Instalando o MSMQ

Para começao a utilizar o MSMQ precisamos ir no “painel de controle” > “Programas e Recursos” > “Ativar ou desativar recursos do Windows” e marcar o checkbox “Serviços do MSMQ (Microsoft Message Queue)” como na imagem abaixo.

Instalando MSMQ

 

 Mãos a Obra

Primeiramente é necessário adicionar a referencia para o  “System.Messaging ” no projeto.

Como o MSMQ pode gerenciar varias filas quando formos criar/utilizar uma fila precisaremos dar um nome e caminho a ela.

Como no exemplo vou utilizar uma lista privada o caminho da lista deve ser “.\Private$\”, caso estivese criando uma lista Publica o caminho seria o o nome do dominio da Rede. O caminho deve ser passado junto com o nome da nossa lista.

Criando/Abrindo uma lista

?View Code CSHARP
1
2
3
4
5
6
MessageQueue msg;
var qName = @".\Private$\teste_app";
if (MessageQueue.Exists(qName))
    msg = new MessageQueue(qName);
else
    msg = MessageQueue.Create(qName);

Essa lista pode receber qualquer tipo de objeto, porem devemos escolher entre 2 tipos de formato, pode ser uma classe serializada ou binario.
Lembrando que se optarmos pelo formato em binario tanto o programa que envia qnt o receptor deve fazer referencia para a mesma dll que contem o objeto.

No exemplo vou passar o seguinte objeto serializado.

?View Code CSHARP
1
2
3
4
5
6
[Serializable]
public class Job
{
    public int ID { get; set; }
    public String Nome { get; set; }
}

Vamos configurar o formato:

?View Code CSHARP
1
msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(Job) });

Agora basta enviar o objeto para a fila

?View Code CSHARP
1
2
var obj = new CommomLib.Job(){ ID = 10 ,  Nome = "Processo 1" };
msg.Send(obj);

Para pegar um item da Lista a outra aplicaçao devera primeiramente abrir a lista da mesma forma utilizada anteriormente, em seguida utilizar o seguinte código:

?View Code CSHARP
1
2
var myMessage = msg.Receive();
Job myJob = (Job)myMessage.Body;

Pronto! simples, agora vamos parar de utilizar banco de dados para gerenciar filas ok 😉

Até a próxima. []s

Debugando Windows Service

Hoje vou ensinar uma forma para debugar windows service.

Ao criarmos um projeto do tipo WindowsService não conseguimos debugar normalmente como qualquer outro tipo de projeto, porem temos uma forma bem simples para contornar esse problema.

Primeiramente devemos criar uma condição na classe Program.cs para identificar se o nosso projeto foi executado em modo de Debug para redirecionarmos a chamada.

Program.cs

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        static void Main()
        {
 
            if (System.Diagnostics.Debugger.IsAttached)
            {
                MeuServico service = new MeuServico();
                service.StartDebug(new string[2]);
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
 
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { new MeuServico() };
                ServiceBase.Run(ServicesToRun);
            }
 
        }

Apos feito isso, basta editar a classe do nosso serviço e adicionar um método StartDebug como no exemplo abaixo.

No service:

?View Code CSHARP
1
2
3
4
        public void StartDebug(string[] args)
        {
            OnStart(args);
        }

Como o Método OnStarde é do tipo protected criamos esse novo método publico para redirecionar a chamada.

Pronto! já podemos debugar nosso projeto normalmente sem nenhum problema.
[]s

Como criar um actionLink para outra Area no Asp.Net MVC3

Fala ae galera.

Quando comecei a trabalhar com áreas no asp.net MVC3 me deparei com essa situação de criar um link que aponte para uma área diferente.
Apesar de ser algo simples fica a dica. 

<%= Html.ActionLink("Descrição do Link", "NomeDaPagina", new { area="NomeDaArea", controller="NomeDoController" } )%>

Ou na sintaxe do Razor:

@Html.ActionLink("Descrição do Link", "NomeDaPagina", new { area="NomeDaArea", controller="NomeDoController" } )

 

Abraços,

Domain Driven Design (DDD)

Comecei a ouvir falar de Domain Driven Design (ou DDD para os íntimos) na  época em que entrei no grupo de discuções do DotNet Architects, percebi que tinha muita gente da comunidade falando a respeito e resolvi entender um pouco mais sobre esse tipo de arquitetura.

O DDD  é um modelo de arquitetura proposto pelo Eric Evans apoiado por grandes gurus da informática, reúne muitos aspectos já existentes formando um padrão que é considerado por muitos como “o retorno da orientação a objeto”.

O foco do DDD é no Domínio (domínio é todo o universo que envolve o seu problema), através da utilização de uma Linguagem Ubliqua e um Modelo Rico, ele tenta prover uma arquitetura clara que revele com facilidade as características e funções de cada elemento do seu sistema assim como a interação entre eles.

Linguagem Ubliqua (ou linguagem onipresente) trata-se da padronização os termos usados na análise e no desenvolvimento, linguagem comum utilizando os mesmos termos do negocio no desenvolvimento evitando modificação dos mesmos ou abuso de termos técnicos não correspondentes ao negocio .

Modelo Rico basicamente seria o uso de objetos com propriedades e  métodos, diferente do modelo anêmico onde os objetos possuem somente propriedades, e os métodos com a regra de negocio concentram-se em classes diferente.

Para criar um bom software você tem que conhecer bem o cenário, refletir o mundo real em código não é algo fácil, e a utilização de uma linguagem Ubliqua  ajuda bastante na hora de construir essa ponte entre o mundo real e as classes. Todos os envolvidos devem estar falando a mesma língua, nada de “tecnês” que não faça parte do domínio.

DDD é ideal principalmente para domínios com regras de negócio complexas pois esse foco em separação de papeis, coesão e simplicidade ajuda e muito na hora de entender cada ponto do sistema para desenvolver e dar manutenção.

Este padrão arquitetural é constituído por alguns elementos, não é necessário utilizar todos, tudo depende do seu cenário; Alguns de seus elementos são: Serviços, Repositórios, Entidades, Objetos de Valor, Agregados, Factories, Modelo Rico,…

Brevemente vou descrever mais detalhadamente cada um de seus elementos.

Por mais que eu goste de DDD e acredite que é uma arquitetura muito poderosa não podemos dizer que ela veio para substituir as outras,  um arquiteto de verdade deve saber observar o problema antes de tudo e decidir a melhor arquitetura que se encaixa ao cenário.

Gosto de trabalhar voltado a DDD de uma forma mais evolutiva, sem me prender logo de cara a todas suas recomendações, vou aplicando cada elemento conforme vai surgindo a necessidade.

E para quem quer se aprofundar no assunto recomendo a leitura do livro do Evans, também tem um e-book gratuito sobre o assunto no infoQ alem da palestra do Giovanni Bassi sobre DDD que dá uma boa ideia geral sobre o assunto.

Estrutura do DDD:

 

Até a próxima.