Springframework.net – Parte 1 – Definição de Objeto


Basicamente o Spring.net é um framework open source que tem o objetivo de facilitar a construção de aplicações .net.

Este framework provê componentes baseado em determinados design patterns (que veremos no decorrer deste artigo), que podem ser integrados em todas as camadas  da arquitetura de sua aplicação. Spring.net ajuda a aumentar a produtividade do desenvolvimento e melhora a qualidade da aplicação, além da performance.

Usando IOC (Inversion of Control)

Nada melhor do que exemplos para clarear nossas idéias.  Vou tentar mostrar de maneira clara uma simples demonstração de IoC  usando Spring.net, exemplo este baseado no que foi discutido no artigo de Martin Fowler. Para mais detalhes ver Inversion of Control Containers and the Dependency Injection pattern. A motivação para iniciar os exemplos com este artigo é justificável pela sua fama, e a maioria das pessoas que procuram por IoC pela primeira vez fatalmente lerão este artigo (se você fizer uma simples consulta no google por “IoC”, não obstante este artigo citado aparecerá entre os cinco primeiros).

O artigo de Fowler usa como exemplo a busca por filmes para ilustrar  a utilização de IoC  e Dependency Injection (DI). O artigo descreve como o objeto MovieLister deve receber a referência para a implementação da interface IMovieFinder usando DI .

A interface IMovieFinder retorna a lista de todos os filmes e MovieLister filtra esta lista e retorna o array de objetos Movie que possuem determinado nome de diretor. Este exemplo demonstra como  IoC com Spring.Net podem ser usados para fornecer apropriada implementação de IMovieFinder para uma instância MovieLister abritrária.

Deu para entender alguma coisa? Não? Não se preocupe, com o exemplo tudo fica mais fácil.

Diagrama de classe (está mais para domínio, mas ok) do nosso exemplo:

 

movie-finder

 

 

 

 

 

Vamos começar – Movie Finder

Nosso exemplo começa com a classe MovieApp, que nada mais é do que uma classe comum:

using System;
namespace Spring.Examples.MovieFinder
{
  public class MovieApp
  {
    public static void Main ()
    {
    }
  }
}

O que nós queremos é dar um get na referência da instância da classe MovieLister. desde que estamos lidando com um exemplo Spring.Net  nós iremos pegar esta referência de dentro do Spring.Net Ioc, the IApplicationContext. (Rá! Agora você está começando a entender)

Existem diversas formas de dar um get na referência na instância de IApplicationContext, mas para este exemplo nós vamos utilizar o IApplicationContext que é instanciado de dentro de uma configuração personalizada em determinada aplicação .net padrão

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="spring">
            <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
    </configSections>
    <spring>
        <context>
            <resource uri="config://spring/objects"/>
        </context>
         xmlns="http://www.springframework.net">
            An  example that demonstrates simple IoC features.
        
    

Os objetos que serão usados nesta exemplo de aplicação serão configurados como objetos XML e seus elementos entre

O corpo do método Main dentro da classe MovieApp pode ser agora concretizada um com um pouco mais de embasamento.

using System;
using Spring.Context;
...
    public static void Main ()
    {
      IApplicationContext ctx = ContextRegistry.GetContext();
    }
...


Como podemos ver no fragmento de C# acima, o statement using foi adicionado no source MovieApp. A namespace Spring.Context dá acesso a aplicação a classe IApplicationContext que servirá de meio para a aplicação acessar o contêiner IoC. A linha de codigo abaixo

IApplicationContext ctx = ContextRegistry.GetContext();

retorna IApplicationContext que foi configurada usando os nodes criados dentro de    na config.file da aplicação.

Definição de objeto

Até agora nenhum objeto foi bem definido dentro do arquivo config da aplicação. E é exatamente o que faremos agora. A definição XML para a instância MovieLister que iremos usar dentro da aplicação pode ser observado no fragmento de XML abaixo:

 xmlns="http://www.springframework.net">
     name="MyMovieLister"
      type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder">
    
  </objects>

Vou logo avisando que o o assembly-qualified name (que obtém o nome por conjunto ou tipo, que inclui o nome do assembly do qual este objeto Type foi carregado) da classe MovieLister foi especificado no atributo type da definição do objeto, e que esta definição tem a assinatura unique id de MyMovieLister.  Usando este id, a instância do objeto definida pode ser recuperada da  referencia IApplicationContext da seguinte forma:

...
    public static void Main ()
    {
      IApplicationContext ctx = ContextRegistry.GetContext();
      MovieLister lister = (MovieLister) ctx.GetObject ("MyMovieLister");
    }
...

A instância lister  não foi devidamente implementada para a interface IMovieFinder . O que ocorre nesta situação é que, ao usar o método MoviesDirectedBy irá retornar, no melhor dos casos, o famigerado NullReferenceException aparece, desde que a instância lister não tenha a referência para IMovieFinder. A configuração do XML para a implementação IMovieFinder que será injetada dentro da instância lister deverá se parecer com isso:

 

 xmlns="http://www.springframework.net">
     name="MyMovieFinder"
        type="Spring.Examples.MovieFinder.SimpleMovieFinder, Spring.Examples.MovieFinder"/>
    
</objects>

 

Aguarde a parte 2 – Setter Injection

 

 

Adalberto de Paula Baccili Junior

MCITP(rgb)

 

 

 

 

Fonte: http://www.springframework.net/doc-latest/reference/html/quickstarts.html

 

 

Categories C#

Knockout


Knockout é uma implementação em JavaScript utilizando o pattern Model-View-View-Model.  Mas o que significa isso? É isso que vou tentar explicar logo mais abaixo, aonde descrevo os princípios fundamentais desse pattern:

  • Clara separação entre dados de domínio, componentes de visualização e os dados que deverão ser exibidos. Não entendeu nada? Fica tranqüilo, logo mais tem exemplo.
  • Presença de uma camada claramente definida e especializada para gerenciar os relacionamentos entre os componentes de visualização (Views), ou seja, tem um cara que coordena tudo, toda entrada e saída de dados.

Knockout é a última palavra em eventos nativos gerenciando suas próprias características  na linguagem javascript.
Estas características são aerodinâmicas e simplificam a especificação de relacionamentos complexos entre componentes de visualização (View), transforma a visualização  mais rápida e  transformando  a experiência do usuário mais rica.
O Knockout foi desenvolvido e mantido por Steve Sanderson, um funcionário da Microsoft. O autor afirma que esta tecnologia  é open source (código aberto), e não um produto da Microsoft.

Características

  • Declarative Bindings;
  • Refresh automático da User Interface (UI) – Quando o data model muda, a UI muda automaticamente;
  • Dependência de rastreamento (Dependency tracking);
  • Templating (uso de um mecanismo de template ativo, ainda que outros mecanismos de templates possam ser usados)

Um exemplo simples

No exemplo abaixo, duas caixas de texto são “ligadas” para observar variáveis no data model.(você ainda vai entender o que é um data model no exemplo adiante)  O display  “Nome Completo” está ligado a um objeto dependente  chamado “observable”, seus valores são computados de acordo com estes “observables”, ou observadores.  Quando a caixa de texto é editada, o “Nome Completo” é automaticamente atualizado, sem necessitar de um evento:

JS
<script src=”@Url.Content(“~/Scripts/knockout-2.3.0.js”)type=”text/javascript”></script>

View (HTML)
<div>
<p>Primeiro Nome: <inputdata-bind=”value: primeiroNome”/></p>
<p>Ultimo Nome: <inputdata-bind=”value: ultimoNome”/></p>
<h2>Olá, <spandata-bind=”text: nomeCompleto”></span>!</h2>
</div>

View Model(JavaScript)
<script language=”javascript”>
var ViewModel = function (primeiro, ultimo) {
this.primeiroNome = ko.observable(primeiro);
this.ultimoNome = ko.observable(ultimo);
this.nomeCompleto = ko.computed(function () {
return this.primeiroNome() + ” “ + this.ultimoNome();

}, this);
}
ko.applyBindings(
new ViewModel(“José”,“da Silva”));
</script>

Pronto, você já fez seu primeiro Knockout!

Adalberto de Paula Baccili Junior
MCITP(rgb)

Categories MVC

Entendendo Action Results


O que é uma Action?
Entenda Action como o nome próprio já diz: Ação. Que tipo de Ação? Ações que vão retornar um resultado, muito óbvio? É para ser mesmo.
Action Results são itens importantes no desenvolvimento com ASP.Net MVC. Eles definem o que serão retornados para o usuário, através de uma view, por exemplo, no caso do usuário precisar ver uma página o
ViewResult se encarrega de exibir a página.Veja o exemplo abaixo:

public ActionResult Register()
{
      return View();
 }

Dessa forma mostrada acima, a ActionResult “Register” exibe uma view para o usuário a partir da “ViewResult”. Dessa forma que está escrita, o MVC entende que possui uma View denominada “Register.cshtml”  e vai exibir essa página. Se você não criou essa página, um erro é retornado.

Os tipos de Action Result são:

  • ViewResult: renderiza a view como uma página
  • PartialViewResult: renderiza uma partial view
  • JsonResult: retorna um objeto JSON serializado
  • FileResult: retorna um arquivo binário
  • ContentResult: renderiza um conteúdo definido pelo programador
  • RedirectResult: redireciona para outra URL
  • RedirectToRouteResult: redireciona para outra action no mesmo ou em outro controller

Existe uma classe base que é comum a todas elas, se chama ActionResult. Dessa forma a maioria dos métodos action tem um retorno do tipo ActionResult.
Mas por que eu vi na Controller métodos com assinaturas diferentes, como por exemplo “public ViewResult MyAction()” ao invés do habitual “public ActionResult MyAction()”? Qual a diferença entre os dois?
A diferença entre os dois é que  a ActionResult é uma classe base para todas as outras, ou seja, com ela você pode renderizar uma view, ou redirecionar uma view e fornecer diferentes  comportamentos. Com a ViewResult você só consegue renderizar uma View específica, desta forma, se você tem certeza de que o seu método irá retornar uma View, você usa a ViewResult.

PartialViewResult
Além de retornar uma view, este action  também pode retornar uma partial view na forma de PartialViewResult via o método PartialView. Segue abaixo um exemplo:

public ActionResult Message()
{
ViewBag.Message =“Esta é uma partial View”;
   return PartialView();
}

Detalhe, neste caso você precisa ter uma view denominada Message.cshtml, caso contrário um erro é retornado. Então, dessa forma, a view Messagem.cshtml será renderizada, mas se o layout estiver especificado pela página _Viewstart.cshtml (e não diretamente dentro da view), o layout  final não será renderizado. O que isso que dizer? Quer dizer que o mvc vai renderizar só a página com o texto, sem o layout bonito que você criou na __ViewStart.cshtml

JsonResult
Este cara retorna um objeto JSON serializado. Mas como ele funciona? Vamos para um exemplo prático:
Imagine que você possui uma página que utilize Ajax, e você precisa dar GET e POST  eventualmente, como você faz?
Segue um passo-a-passo:
1) Criar um .cshtml ( ou deixar na Index mesmo, se você estiver trabalhando com um projeto pronto)


<script type=”text/javascript”>
function obterCallback(retorno,status) {
$(“#txtNome”).val(retorno.Nome);
$(“#txtIdade”).val(retorno.Idade);
}

function enviarGet() {
if ($(“#txtNome”).val() == “” || $(“#txtIdade”).val() == “”) {
alert(“Preencha todas os campos!”);
return; }
$.get(“Ajax/EnviarGet”,
{ nome: $(“#txtNome”).val(), idade: $(“#txtIdade”).val() },
        obterCallback

);
}
</script>

<p>

Nome:

<inputtype=”text”id=”txtNome”/></p>
<p>
Idade:
<input type=”text”id=”txtIdade”/>
</p>
<input type=”button” value=”Enviar Get”     onclick=”enviarGet();“/>

2) Criar no Controller (Eu criei um Controller denominado Ajax) o método que vai enviar o GET:
public JsonResult EnviarGet(string nome, int idade)
{
      var json = new { Nome = nome, Idade = idade};
      return Json(json, JsonRequestBehavior.AllowGet);
}
Obs: O que  é JsonRequestBehavior ? Esse cara serve para especificar se a solicitação HTTP Get são permitidas. É uma segurança contra Hijack.

Decidi abranger os que eu mais utilizo, não desmerecendo as outras Action que não mencionei em detalhes como FileResult, ContentResult, RedirectResult e RedirectToRouteResult, mas posso tratá-las em outro artigo. Bem, é isso!

Adalberto de Paula Baccili Junior

MCITP(rgb)

Categories MVC

Roteamento de URL


O que é?

Rotear um endereço é uma forma de deixar a sua aplicação mais elegante. O que isso quer dizer? Quer dizer que  você consegue expor para o usuário URL’s mais simples e mais amigáveis. Exemplificando,  segue abaixo a forma tradicional:

http://www.meusite.com/produtos.apx?categoria=software

Agora, usando a forma de mecanismo  de roteamento, é possível configurar a URL para exibir a mesma informação, de um jeito um pouco diferente:

http://www.meusite.com/produtos/software

Precisamos entender como funciona este modelo e como a requisição por essa forma de passar URL exibe a página desejada. Primeiramente temos que entender que uma requisição feita pelo navegador está mapeada para uma ação de controller (Controller Action) (Se você não sabe o que é controller, sugiro que volte alguns passos para entender melhor o que estamos falando), através do recurso do ASP.Net Framework chamado ASP.Net Routing, este cara é usado no ASP.Net MVC para rotear as requisições recebidas pelo controlador(Controller).
O ASP.Net Routing usa uma tabela de rotas para lidar com as requisições recebidas.

Mas o que é uma tabela de rotas?

A tabela de rotas é criada quando sua aplicação web é iniciada, e é definida no Global.asax. Abaixo segue um exemplo de uma aplicação ASP.Net MVC:

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
        routes.MapRoute(“Default”, // Route name
“{controller}/{action}/{id}”, // URL with parameters
   new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults
);
}

Quando a aplicação roda pela primeira vez, o Método Application_Start() é invocado, e este método chama o método RegisterRoute(RouteTable.Routes). Este método cria a tabela de rotas padrão:

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}

Esta rota é dividida em 3 segmentos: {controller}/{action}/{id}
{controller} = Mapeado para o nome do Controlador (Controller)
{action} = Mapeado para o nome da ação
{id} = Mapeado para um parâmetro passado para uma ação de chamado id (Você vai entender o que é esse cara mais na frente)

Vamos considerar como exemplo a url “Produto/Detalhe/3”.

Esta URL é dividida dessa forma pelo MVC:

  • Controller => Produto
  • Action =>Detalhes
  • id  => 3

Esta rota padrão definida no arquivo Global.asax inclui também valores para estes 3 parâmetros, que estão logo mais abaixo do código da Map.Route: {controller=”Home”, action=”Index”, id=””}, aonde:

  • Controller padrão é => Home (controller=”Home”)
  • Action padrão é =>Index (action=”index”)
  • Id padrão é =>  id(id=””)

Agora que já entendemos  esta definição, vamos ver como ficaria mapeada a seguinte URL => /Produto

  • Controller => Produto
  • Action => Index
  • Id=””

Mas o que tudo isso significa? Significa que  a Ação Index() será roteada da classe HomeController.aspx.
Mas e se não tivermos a classe HomeController.aspx? Sua aplicação não vai inicializar corretamente, ocasionando em tela amarela.

A classe HomeController precisa conter o método correspondente  ao que foi sinalizado na Map.Route, como mostra a imagem abaixo:
public ActionResult Index()
{
ViewBag.Message =“Welcome to ASP.NET MVC!”;
    return View();
}
Aham, e daí, o que vem depois?
Dessa forma a URL Home/Index invoca o método Index() dentro da Controller e retorna a página. Que página? A Index.cshtml, que não é por acaso que possui o mesmo nome da ActionResult da Controller.

Espero que com isso você compreenda como funciona o roteamento.

Adalberto de Paula Baccili Junior
MCITP(rgb)

Categories MVC

Delegates


Basicamente é similar ao ponteiro da antiga linguagem C, em que funções podem ser assinadas como uma variável e chamadas em tempo de execução, baseada em condições variadas. O delegate em c# é a versão melhorada dos ponteiros, que muito ajudam arquitetos de sistema e programadores, especialmente quando utilizam design patterns.
A princípio, um delegate é definido com uma assinatura específica( return type, parameter type and order etc). Para chamar (invoke)  um objeto delegate, um ou mais métodos são requisitados com a MESMA assinatura. O objeto delegate será criado similar a criação de um objeto. O objeto delegate irá basicamente guarder a referência da função. A função será desta forma chamada pelo objeto delegate. Nada melhor do que um exemplo para explicar isso de maneira mais sucinta:

1. Criar a classe MyClass.cs e definir o delegate, conforme segue abaixo:

MyClass

2.Criar a classe Program.cs e chamar o delegate, conforme segue abaixo:

Program

Simples?

Fonte: http://code.msdn.microsoft.com/Simple-C-Delegate-Sample-879e82ad

Adalberto de Paula Baccili Junior

MCITP(rgb)

Categories C#

Particionamento de bloqueio – parte I


Pré-requisitos:

  • Conceito de objetos e subtipo
  • Conceito de transação

Particionamentos de bloqueio funcionam da seguinte forma:
Imagine que você está trabalhando em um sistema gigantesco acessado por inúmeros clientes  a todo instante,  e sua tarefa é melhorar o desempenho da base de dados deste sistema. Já é de conhecimento de todos que quando são bloqueados objetos que são referenciados com frequência, o desempenho é prejudicado, devido ao afunilamento de recursos.  A grosso modo, o SQL Server bloqueia o acesso ao objeto para alguns clientes, para que outros clientes possam acessar a tabela, quando isso ocorre em larga escala você tem uma queda no rendimento da sua aplicação. Então como resolver este problema? Resposta: Utilizando o Particionamento de Bloqueios.
Este recurso do SQL Server 2008 R2 melhora o desempenho do bloqueio dividindo um único bloqueio em vários recursos de bloqueio. É ativado automaticamente para sistemas com 16 ou mais CPU’s, e não pode ser desabilitado. Muito teórico?  Aguenta mais um pouco que está acabando.

Compreendendo mais a fundo o particionamento de bloqueio

Como já explicamos acima, o particionamento de bloqueio “pega” o bloqueio e subdivide o objeto em vários recursos de bloqueio, fazendo com que todos os clientes que precisam acessar o objeto não precisem aguardar a finalização de acesso de outro cliente. Para realizar a tarefa de particionamento de bloqueio o SQL Server utiliza dois recursos, Spinlock e Memória :

  • Spinlock: Controla o acesso a um recurso de bloqueio, como uma linha ou tabela. Em outras palavras, quando existe um bloqueio específico, e este bloqueio é subdividido em vários recursos deste objeto, o que ocorre é que o spinlock entra em ação para gerenciar estes recursos.
  • Memória: É usada para armazenar as estruturas de recurso de bloqueio. quando o spinlock é usado, as estruturas de bloqueio são armazenadas nas memória, e então são acessadas ou modificadas.

Implementando e monitorando o particionamento de bloqueio

Como já foi falado anteriormente, o particionamento de bloqueio é ativado automaticamente para sistemas com 16 ou mais CPU’s. No momento da ativação, uma mensagem informativa é registrada no log de erros do SQL Server.  Existem diversos modos de bloqueio, que segue:

  • Bloqueios de uma única partíção: NL, SCH-S, IS, IU e IX
  • Bloqueio de várias partições: S (Shared) e X (Exclusive)

Modos Shared, Exclusive e os outros mencionados acima iniciam suas partições com ID 0 e vão seguindo na ordem de ID. O aumento de memória é determinado pelo número de partições. Para verificar os contadores de bloqueio é necessário acessar o Monitor de desempenho do Windows, lá será exibido as informações sobre memória e bloqueios particionados e não particionados.

Pontos importantes:

  •  Ao iniciar uma transação, a partição é acionada.
  • Todas as solicitações de bloqueio que podem ser particionadas usam a partição atribuída a transação.
  • Objetos que possuem subtipo não são particionados

Adalberto de Paula Baccili Junior

Categories SQL