none
SmartClient on ou Off, esbarrei com problema de Interface. RRS feed

  • Pergunta

  •  

    Saudações,

     

    O cenário é: Criar uma aplicação que acessa os dados localmente ou por webservice. Uma solução seria fazer tudo por webservice e instalar tudo no cliente. Mas quero tentar uma outra solução, pois ficaria dependendo do IIS.

     

    Tem todo um material de patterns sobre isso o Smart Client Software Factory - June 2006 e já tem o 2007, no caso baixei e instalei o 2006 segue o link para quem tiver interesse http://msdn2.microsoft.com/en-us/library/Aa480481.aspx 

     

    E muito material, tanta coisa que ficamos perdidos, e ainda estou estudando o WCF..não gosto de reinventar a roda.. mas diante de tanta informação.. tantas opções que não da tempo de acompanhar e tentamos nos virar no momento com aquela informação que sabemos.. Essa material vai muito além do meu cenário, pois ele trata questão da aplicação rodar hora on e hora off, o que não seria o meu caso.

     

    Vou explicar o elefante branco que eu montei...rs

     

    Uma camada que chamo de DataBusinessesComponent (DBC) que seria um dataset com a datatable e o adapter configurado com o getdata.. e stores procedures de insert, delete e update, ou seja tudo que for de acesso a banco fica ai.

     

    Outra camada de Interface. Para cada datatable do meu dataset criei uma interface que tem os metodos do adapter, ou seja GetData, Fill.. e etc... com nomes diferentes, apenas coloquei o F na frente então ficou FGetData...e etc

     

    Na camada DBC fiz um partial do Adapter, exemplo TbClienteDataAdapter, e nesse partial extends a interface ICliente e codifica os metodos. Exemplo:

     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Data;

    namespace TaskerManagerDBC.DSTableAdapters

    {

    public partial class tbProjetoTableAdapter : TaskeManagerInterface.IProjeto

    {

    public DataTable FGetData()

    {

    return this.GetData();

    }

    }

    }

     

    Fiz outra camada de webservice que implementa tb a interface

     

    using System;

    using System.Web;

    using System.Web.Services;

    using System.Web.Services.Protocols;

    using System.Data;

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    public class Projeto : System.Web.Services.WebService , TaskeManagerInterface.IProjeto

    {

    public Projeto () {

    //Uncomment the following line if using designed components

    //InitializeComponent();

    }

    TaskerManagerDBC.DSTableAdapters.tbProjetoTableAdapter obj = new TaskerManagerDBC.DSTableAdapters.tbProjetoTableAdapter();

    [WebMethod]

    public DataTable FGetData() {

    return obj.GetData();

    }

    }

     

     

    Implementei outra camada que chamei de FactoryComponent que ficou assim:

     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Data;

    namespace TaskerManagerFactoryComponent

    {

    public class Projeto : BaseComponent

    {

    public TaskeManagerInterface.IProjeto getObject()

    {

    if (base.IsSmartClient()) return (TaskeManagerInterface.IProjeto)new WbSrvProjeto.Projeto();

    else return new TaskerManagerDBC.DSTableAdapters.tbProjetoTableAdapter();

    }

    }

    }

     

    Essa camada implementa uma BaseComponent que apenas lê um valor do settings boleano que indica se é uma aplicação smartclient ou não. E retorna o objeto. Tive que fazer um cast para a interface no caso da WebService, pois o compilador reclamou.

     

    Por fim meu front end, uma aplicação Windows Form que ficou assim:

     

    private void Form1_Load(object sender, EventArgs e)

    {

    TaskerManagerFactoryComponent.Projeto facProjeto = new TaskerManagerFactoryComponent.Projeto();

    TaskeManagerInterface.IProjeto objprojeto = facProjeto.getObject();

    DG.DataSource = objprojeto.FGetData();

    }

     

    Agora o problema...

     

    Compila e executa quando a aplicação não é smart, mas quando passei para consumir a WebService dá erro na linha:

     

    if (base.IsSmartClient()) return (TaskeManagerInterface.IProjeto)new WbSrvProjeto.Projeto();

     

    Não é possível converter um objeto do tipo 'TaskerManagerFactoryComponent.WbSrvProjeto.Projeto' no tipo 'TaskeManagerInterface.IProjeto'.

     

    Tive o mesmo problema quando a webservice retornava um DataTable Tipado, mais ele não deixa fazer cast para o mesmo tipo de retorno, só aceitou para não tipado... achei estranho...

     

    Se resolver esse problema devo adotar esse modelo, apesar de dar um pouco de trabalho, pois tenho que escrever a interface, e "reescrever" os metodos para o Adapter. Para a WebService já teria que escrever mesmo então não tem perda. Com esse modelo não preciso alterar nada o meu front end.

     

    Se eu não resolver isso vai dar mas trabalho ainda, pois na camada de Factory, na verdade não seria mas Factory, pois implementaria ali todos os metodos do DBC e o if do smart dentro de cada método.

     

    Se isso funciona-se poderia estender de forma a aplicação trabalhar hora off, hora on. Iria implementar um serviço na camada do Factory onde se encarregaria de fazer o sicronismo dos dados.

    sexta-feira, 28 de setembro de 2007 08:31

Todas as Respostas

  • Oi !

     

    Não entendi muito bem não, está muito confuso...

     

    A questão é : Use WCF. Me pareceu, pela sua descrição, que você deseja independência de localização, recurso oferecido pela arquitetura SOA e que o WCF vai conseguir para você.

     

     

    Só para constar : Entre serialização (xml), deserialização e passagem entre projetos, a classe transmitida não é exatamente ela mesma, gerando erro de cast. Mas isso não será importante com o WCF.

     

    []'s

     

    Meu Blog : http://blog.dennestorres.com.br/

     

     

    sexta-feira, 28 de setembro de 2007 10:43