|
Na primeira parte desse artigo (.NET Remoting – Parte 1), conhecemos com detalhes a arquitetura da tecnologia .NET Remoting. A parte final desse artigo abordará os detalhes do desenvolvimento para implantação de Remoting em suas aplicações. Faremos um exemplo simples de acesso e retorno dos dados para preenchimento de uma DataGrid afim de demonstrar de forma clara a implantação.
Teremos 4 projetos em nossa solution sendo eles:
- Componente de Negócio (ClassLibrary): Classes de negócio do projeto que contendo as classes e métodos de negócio.
- Componente de Interface (ClassLibrary): Interfaces com os métodos que serão implementados pelas classes de negócio.
- Projeto de Interface com o usuário (WindowsApplication): Formulário com exibição de retorno dos dados
- Aplicativo Servidor (Console Application): Componente para abertura do canal Remoting
Abra o Visual Studio .NET e vamos iniciar a criação da nossa aplicação que fará uso de .NET Remoting: Crie um novo projeto (Menu File => New => Project) escolha um projeto do tipo C# Class Library, nomeie o projeto para InterfaceRemoting, a Solution para Remoting e clique OK. Após a criação do Projeto, codifique o arquivo Class1.cs conforme mostra o código abaixo:
using System;
using System.Data;
namespace InterfaceRemoting
{
public interface ICliente
{
DataTable getCustomers();
}
} |
Essa interface expõe o método getProducts que será implementado pelo componente de negócio e invocado pelo projeto WindowsApplication que criaremos logo a seguir. Em seguida adicione um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Class Library por nome Negocio, confirme com “OK” e codifique o arquivo Class1.cs conforme mostra o código abaixo:
using System;
using System.Data;
using System.Data.SqlClient;
using InterfaceRemoting;
namespace Negocio
{
public class Cliente: MarshalByRefObject, InterfaceRemoting.ICliente
{
public Cliente()
{
}
public DataTable getCustomers()
{
SqlConnection conn = new SqlConnection("Server=(local);Initial Catalog=NorthWind;Integrated Security=SSPI");
DataTable clientes = new DataTable(“Clientes”);
SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Customers",conn);
adap.Fill(clientes);
return clientes;
}
}
} |
Veja que estamos fazendo referência ao projeto InterfaceRemoting que contém a interface ICliente, vamos então referenciar o assembly no projeto. Para adicionar a referência, clique com o botão direito no Projeto Negocio => “Add Reference” => Guia “Projects” selecione o assembry e confirme conforme mostra a Figura 1. É necessário ainda tornar a classe Cliente derivada (herdar) de MarshalByRefObjecte também implementar a interface ICliente conforme visto anteriormente para que a infra-estrutura do Remoting seja capaz de interpretar a transferência dos objetos.

Figura 1 – Referenciando o Componente de Interface no Projeto
Continuando com o desenvolvimento da aplicação, vamos incluir o componente que ficará alocado no servidor. Para o exemplo, utilizaremos um projeto Console, deixo como dica utilizar um WinService para a criação do canal Remoting. Adicione então um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Console Application por nome Server, confirme com “OK” e codifique o arquivo Class1.cs conforme mostra o código abaixo:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using Negocio;
namespace Server
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
| RemotingConfiguration.RegisterWellKnownServiceType(typeof(Client e),"Negocio",WellKnownObjectMode.SingleCall); |
ChannelServices.RegisterChannel(new TcpServerChannel(1235));
Console.WriteLine("Canal Remoting criado, aguardando requisições");
Console.ReadLine();
}
}
} |
O objeto RemotingConfiguration utiliza do método RegisterWellKnownServiceType para informar os parâmetros de criação da infra-estrutura do Remoting. O parâmetro Type recebe o tipo do objeto que será tranportado pelo canal remoting. O segundo parâmetro recebe o nome da Ativação e o terceiro parâmetro recebe o tipo da Ativação (SingleCall / Singleton). Em seguida utilizamos do método RegisterChannel do objeto ChannelServices para registrar o canal do Remoting através da porta 1235 (poderia ser usado outra porta). Como você pode notar, fizemos referência aos namespaces do Remoting “System.Runtime”, para isso precisamos também referenciar o Assembly no projeto (botão direito no Projeto Server, aponte para “Add Reference”) conforme mostra a Figura 2:

Figura 2 - Referenciando o assembly System.Runtime.Remoting
Além dessa referência, ainda é necessário referenciar os assemblys Negocio e InterfaceRemoting (pois fazemos referencia a classe Cliente) utilizando o mesmo procedimento mas localizando-os na Guia Projects.
Por fim, criaremos a aplicação que fará a requisição do objeto Cliente remotamente e execução do método getCustomers().
Adicione então um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Windows Application por nome Client, confirme com “OK”. O Visual Studio criará o formulário padrão Form1.cs, formate o layout do formulário conforme mostra a figura abaixo:
Formulário |
Text: Fazendo chamada ao componente remoto utilizando .NET Remoting |
Botão |
Text: Carregar Dados remotamente
Name: btCarregar |
DataGrid |
Name: dtgClientes |

Layout do Formulário para carga dos dados remotamente
Adicione também a referência para o projeto InterfaceRemoting conforme mostra a Figura 1 e para o Assembly “System.Runtime.Remoting” conforme mostra a Figura 2.
Com o formulário já finalizado, importe os namespaces necessários e codifiquei o evento Click do botão btCarregar como mostra o código abaixo:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using InterfaceRemoting;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Tcp;
private void btCarregar_Click(object sender, System.EventArgs e)
{
ICliente cli;
cli = (ICliente)Activator.GetObject(typeof(ICliente),"tcp://localhost:1235/Negocio");
dtgClientes.DataSource = cli.getCustomers();
} |
Ao clicar no botão btCarregar será feito a chamada ao componente remoto através do método getObject do objeto Activator. Ele recebe por parâmetro o tipo requerido para a chamada, o endereço remoto (no exemplo utilizei localhost) acompanhado da porta mais o nome da URI informada no componente Servidor. Veja que utilizamos o protocólo TCP mas como já visto no artigo anterior poderiamos ter utilizado HTTP para o tranporte do objeto. Após a chamada atribuimos o retorno ao dataGrid para que os dados sejam exibidos.
Para fazer o teste da aplicação, é necessário alterar a ordem da chamada dos projetos e configurar para executar em “Multiple Startup Projects”, para isso, clique com o botão direito na solution “Remoting” e configure a janela conforme mostra a figura abaixo.

Alterando a ordem de execução dos projetos

Canal Remoting aberto e aplicação Client com o retorno dos dados remotos
Conclusão
Nesse artigo vimos como é simples a implementação de acesso remoto utilizando .NET Remoting como alternativa a outros métodos. Com uma boa infra-estrutura e técnicas corretamente aplicadas, podemos obter grandes ganhos de performance nas chamadas aos componentes.
|