Problemas com Repositorio Genericos

195 views
Skip to first unread message

Daniel Sato

unread,
Aug 2, 2010, 9:17:24 AM8/2/10
to dotnetar...@googlegroups.com
Bom dia Pessoal

Estou desenvolvendo uma biblioteca visual que se comunica diretamente com o Repositorio.

Todas a minhas classes de Dominio herdam de uma EntidadeBase

class EntidadeBase: IEntidade
{
   public int64 id { get; private set;}

}


Agora o Repositorio eu Criei usando Generics, +- assim

class RepositorioBase<T>: IRepository<T>
{
...//metodos do repositorio
}

T é sempre do Tipo IEntidade.


Até aqui tudo bem. Agora começa o Problema.

Na biblioteca visual p/ winForms eu criei um formulario de Listagem Padrao (FrmListPadrao)  e um de Cadastro Padrao.(FrmCadPadrao)
sempre que eu quero ter uma lista de determinada Entidade eu crio um Formulario que herda FrmListPadrao, e sempre q eu desejo manipular
essa entidade eu crio um form q herda de FrmCadPadrao.


O problema esta no Repositorio, por exemplo

No Formulario de Listagem Padrao fiz o seguinte:

class FrmListPadrao : Form
{
    //construtor...
   
   //Repositorio usado no Formulario que vai herdar desse Formulario 
   protected IRepositorio<IEntidade> _repositorio;

   //Formulario usado para inserir ou alterar a entidade selecionada pelo usuario
   protected FrmCadPadrao _frmCadastro;


   protected IEntidade getEntidadeCorrente()
   {
          IEntidade entidade = null
          if (bindingSourceListagem.Count > 0)
              entidade = (IEntidade)bindingSourceListagem.Current();

          return entidade;
   }


   //metodo invocado pelo clique do Botao Excluir
   private void ExcluirEntidade()
   {
        _repositorio.Excluir(getEntidadeCorrente());
   }

   ///Metodo invocado no clique do Botao Alterar
   private void AlterarEntidade()
   {
        _frmCadastro.AlterarEntidade(getEntidadeCorrente());
        _frmCadastro.ShowModal;      
   }

   ///Metodo invocado no clique do Botao Novo Registro
   private void NovaEntidade()
   {
        _frmCadastro.NovaEntidade();
        _frmCadastro.ShowModal;      
   }
}

No Formulario que herda de FrmListPadrao eu tenho q fazer o seguinte, e é aqui q o problema começa:

class FrmListClientes : FrmListPadrao
{
    //contrutor
    public FrmListClientes()
    {
        ......
        this._repositorio = new RepositorioBase<Cliente>();
        //O Formulario FrmCadCliente herda de FrmCadPadrao e recebe por parametro um repositorio para
        //persistir os dados
        this._frmCadastro = new FrmCadCliente(this._repositorio);
    }

}

O Codigo acima não compila, o Compilador diz que IRepositorio<IEntidade> que o objeto protegido _repositorio
é incompativel com Repositorio<Cliente>, não entendo o porque se o RepositorioBase implementa a Interface IRepositorio
e o Tipo Cliente herda de EntidadeBase que implementa a Interface IEntidade.

Tentei Fazer cast mas em tempo de Execução dá erro.

Estou achando q isso é um problema do Generics, pelo q me parece ele nao consegue trabalhar com polimorfismo. Talvez eu esteja
entendo errado alguma coisa.
Alguem poderia me ajudar, esse problema esta invalidando a minha biblioteca de UI.






 

tucaz

unread,
Aug 2, 2010, 9:36:16 AM8/2/10
to .Net Architects
Daniel,

isso é "problema" de co/contra variância. Repository<IEntidade> não é
a mesma coisa que Repository<MinhaEntidade> memso que MinhaEntidade
implemente IEntidade.

Post do Giovanni a respeito: http://unplugged.giggio.net/post/C-40-Teremos-covariancia-e-contravariancia.aspx

Daniel Sato

unread,
Aug 2, 2010, 10:03:57 AM8/2/10
to dotnetar...@googlegroups.com
Caramba,

quer dizer q eu não tenho como fazer o que estou querendo. Vou ter q duplicar codigo em todas os
formulários. Alguem nao teria alguma ideia de como resolver isso? Talvez utilizando outra abordagem?

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br

Gustavo Rocha

unread,
Aug 2, 2010, 10:05:55 AM8/2/10
to dotnetar...@googlegroups.com
Perai. tem como fazer isso sim. Guenta ai

Sidney Lima Filho

unread,
Aug 2, 2010, 10:12:23 AM8/2/10
to dotnetar...@googlegroups.com
Daniel,

   isso é uma limitação que eu até acho saudável do generics do C#. Ajuda a entendermos as fronteiras da nossa modelagem de dominio.

Para resolver seu problema pense no seguinte codigo abaixo


class FrmListClientes<T> : FrmListPadrao
{
    IRepositorio<T> _repositorio;


    //contrutor
    public FrmListClientes()
    {
        ......
        this._repositorio = new RepositorioBase<Cliente>();
        //O Formulario FrmCadCliente herda de FrmCadPadrao e recebe por parametro um repositorio para
        //persistir os dados
        this._frmCadastro = new FrmCadCliente(this._
repositorio);
    }

}



Sidney Lima Filho  ---------------------------------------------------------------------
Vivina Softhouse
(0xx21) 7867-2321
55*10*68934
http://www.vivina.com.br
http://twitter.com/sidneyfilho


2010/8/2 Gustavo Rocha <gustav...@gmail.com>

Gustavo Rocha

unread,
Aug 2, 2010, 10:13:51 AM8/2/10
to dotnetar...@googlegroups.com
Eu acho que a solucao pra isso é tbm usar generics no form. passando o
repositorio. Vou fazer aqui e ja mando

Diullei Gomes

unread,
Aug 2, 2010, 10:14:26 AM8/2/10
to dotnetar...@googlegroups.com
Não sei qual vai ser a sugestão do @Gustavo (acredito que será muito boa! rs) mais eu faria com que os formulários base exigissem um genérico tipo: FrmListPadrao<T> e FrmListClientes<T>

Assim sempre que quisesse herdar o formulário eu faria assim:


MeuForm<Cliente> : FrmListPadrao<T>

...

Acho que resolveria o problema!


2010/8/2 Sidney Lima Filho <sidney...@vivina.com.br>



--
Diullei Gomes
Desenvolvedor .NET
http://diullei.com/
http://twitter.com/diullei

Diullei Gomes

unread,
Aug 2, 2010, 10:15:39 AM8/2/10
to dotnetar...@googlegroups.com
Opa! respondi junto com os kras! rs...

Mais é isso ai... unanimidade no uso de generics!

2010/8/2 Gustavo Rocha <gustav...@gmail.com>



--

Gustavo Rocha

unread,
Aug 2, 2010, 10:24:54 AM8/2/10
to dotnetar...@googlegroups.com
Ah entao. Ja responderam ai. É isso mesmo.

Pode ser que vc tenha problema pra renderizar o form em design time ao
usar generics no form. Ai tem um outro corcov que tem que dar, mas a
solucao pra tipagem do repositorio é essa ai.

Daniel Sato

unread,
Aug 2, 2010, 10:28:47 AM8/2/10
to dotnetar...@googlegroups.com
É pessoal acho q essa será a solução mesmo. Vou tentar mais tarde em casa e depois dou um
parecer para vcs. Por enquanto obrigado pelas sugestões.

Bruno D'Alessio

unread,
Aug 2, 2010, 1:10:32 PM8/2/10
to dotnetar...@googlegroups.com
Vai na fé que a galera que respondeu sabe o que esta falando, a solução é essa mesmo.

Abs,
Bruno D'Alessio
Arquiteto de Software

Plácido Bisneto

unread,
Aug 2, 2010, 2:40:25 PM8/2/10
to dotnetar...@googlegroups.com
É  Gustavo.. Realmente vai dar esse problema no designer.
Mas o código roda sem problema.. o negócio é desenvolver sem o designer.. 
Eu tenho um projeto parado que eu tentava aplicar estilização CSS no windows forms e fazia uso disso, mas não deu certo, pelo menos por enquanto!


Plácido Bisneto - .NET Developer


Em 2 de agosto de 2010 11:24, Gustavo Rocha <gustav...@gmail.com> escreveu:

Diullei Gomes

unread,
Aug 2, 2010, 3:11:15 PM8/2/10
to dotnetar...@googlegroups.com
@Placido,

eu passei por um problema de design parecido com esse e quem me passou uma solução para resolver foi um amigo aki da lista. O que vc precisa fazer é criar uma classe intermediária que herde da classe que exige o generic tipando o argumento, e depois fazer com que o seu formulário herde desta classe intermediária. Seria algo mais ou menos assim:

// Formulário base...
public partial class FormBase<T> : Form where T: IEntidade
{
public FormBase()
{
//...
}
}

// Classe intermediária...
public class FormClienteWrapper : FormBase<Cliente>
{
}

// meu formulário final...
public partial class FormClient : FormClientWrapper
{
public FormClient()
{
InitializeComponent();
}
}

Veja que eu tipo o generic na classe FormClienteWrapper e faço com que meu formulário herde desta classe. Com isso eu consigo resolver o problema de renderização do design. Não sei se existe uma outra solução mais elegante. Utilizo esta e funciona.

Espero ter ajudado.

2010/8/2 Plácido Bisneto <placido...@gmail.com>

Gustavo Rocha

unread,
Aug 2, 2010, 3:33:04 PM8/2/10
to dotnetar...@googlegroups.com
@Diullei, eu queria saber se tem uma solucao mais elegante tbm, mas
foi essa ai que a gente teve que usar, ne?!. Ficou ruim mas ficou
bom. rsrs

@Placido, tenta essa wrapper ai q foi coisa da minha cabeca, nao sei
pq chamei de wrapper e ve se funciona.
Nao da p ficar sem o designer. Mas achei uma limitacao ruim do
windowsforms. O que acontece é que en design time o framework tbm
tenta executar parte do codigo que esta declarado no designer. Como
esse tipo ainda nao foi resolvido, ele da pau.

Abs

Gustavo Rocha

Bruno D'Alessio

unread,
Aug 2, 2010, 4:50:58 PM8/2/10
to dotnetar...@googlegroups.com
@Gustavo,
solução elegante para esta "gambiara" seria um patch da Microsoft para o VS2008
acrecentando suporte a generics em modo design.

Sinceramente não sei se isso foi corrigido no VS2010.

Abs,

Diullei Gomes

unread,
Aug 2, 2010, 4:53:25 PM8/2/10
to dotnetar...@googlegroups.com
krak "gambiarra" rs!

pra mim no VS2010 a gambiarra ainda é a solução! rs

2010/8/2 Bruno D'Alessio <bruno...@gmail.com>

Gustavo Rocha

unread,
Aug 2, 2010, 5:56:32 PM8/2/10
to dotnetar...@googlegroups.com
rsrsrsrs Vcs tem razao. Os dois. rsrsrs

Entao, o lance é pelo menos vc poder controlar esse problema do
generics. Eu entendo o lance da execucao do codigo ainda em runtime,
isso é um avanco, mas essa falha eh complicada. Alguns vao querer me
matar, mas no que diz respeito a heranca visual( nao por conta de
generics, claro ) acho que o Winforms ainda deixa a desejar em uns
aspectos. Nisso o delphi era foda.

Daniel Sato

unread,
Aug 3, 2010, 7:53:03 AM8/3/10
to dotnetar...@googlegroups.com
Segui as dicas de vcs e fiz o meu formulário genérico. Cheguei nesse problema do VS não mostrar o Form em design e me apavorei. Realmente o Delphi contorna isso facilmente e de maneira elegante.
Agora vou tentar fazer esse Lance que o Diullei sugeriu. Vamos ver o que dá. Mas desde já eu agradeço pessoal. Valeu

Bruno D'Alessio

unread,
Aug 3, 2010, 10:17:42 AM8/3/10
to dotnetar...@googlegroups.com
Sato,
a solução do Diullei (que na verdade é do Gustavo Rocha) funciona sim, não se apavora não.
 
Abs,

Daniel Sato

unread,
Aug 4, 2010, 8:31:41 AM8/4/10
to dotnetar...@googlegroups.com
Pessoal acatei a sugestao de vcs, mas ainda assim nao renderiza. Esta dando problema com os resources usados no formBase, pelo visto se trata das imagens usadas nos botoes. O componente que dá o erro é o imagemCollection. Notei tambem que o metodo InitializeComponent() é gerado imcompleto e o Form.resx tambem nao é gerado.
Alguem sabe como eu poderia resolver isso?

Gustavo Rocha

unread,
Aug 4, 2010, 8:44:52 AM8/4/10
to dotnetar...@googlegroups.com
é o seguinte. Vc deve ter mudado a herenca so no Form.cs. Voce precisa
tambem mudar a heranca no Form.Designer.cs

Como se trata de uma partial class, se voce nao fizer nas duas, elas
nao se completam em estrutura.

Daniel Sato

unread,
Aug 4, 2010, 10:27:49 AM8/4/10
to dotnetar...@googlegroups.com
Gustavo fiz o que vc disse o erro persiste
Olha a mensagem:

"Could not find any resources appropriate for the specified culture or the neutral culture.  Make sure "MEB.UI.Foms.FrmBase`1.resources" was correctly embedded or linked into assembly "MEB.UI" at compile time, or that all the satellite assemblies required are loadable and fully signed."

Me parece problema com resources

Instances of this error (1)

1.
Hide Call Stack
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
at System.Resources.ResourceManager.GetObject(String name)
at MEB.UI.Foms.FrmBase`1.InitializeComponent() in C:\Desenvolvimento\VS\Bibliotecas\MEB.UI\MEBUI\Foms\FrmBase.Designer.cs:line 51
at MEB.UI.Foms.FrmBase`1..ctor() in C:\Desenvolvimento\VS\Bibliotecas\MEB.UI\MEBUI\Foms\FrmBase.cs:line 18
at MEBFrota.ClienteWrapper..ctor()

Daniel Sato

unread,
Aug 4, 2010, 10:28:24 AM8/4/10
to dotnetar...@googlegroups.com
Será q nao tem alguma coisa a ver com os resources?

Daniel Sato

unread,
Aug 4, 2010, 10:39:37 AM8/4/10
to dotnetar...@googlegroups.com
A Aplicação chegou a compilar. Mas quando instancio o formulario que herda do Formulario Generico
dá erro na seguinte linha do InitializeComponent();

            //
            // imageCollection1
            //
            this.imageCollection1.ImageStream = ((DevExpress.Utils.ImageCollectionStreamer)(resources.GetObject("imageCollection1.ImageStream")));

a mensagem de Exceção é a seguinte

"Nenhum recurso adequado para a cultura especificada (ou a cultura neutra) foi encontrado no assembly dado. Verifique se \"MEB.UI.Foms.FrmBase`1.resources\" foi incorporado ou vinculado ao assembly \"MEB.UI\" corretamente no tempo de compilação ou se todos os assemblies satélites necessários podem ser carregados e estão totalmente assinados."

O erro me parece ser com a imagens. Alguem sabe como resolver esse problema?

Gustavo Rocha

unread,
Aug 4, 2010, 11:20:00 AM8/4/10
to dotnetar...@googlegroups.com
Ah cara. faz do zero. rsrs
Te digo que funciona. Isso ta parecendo confusao de agonia mesmo. Possessao demoniaca.
Faz do zero, com calma, carinho, coloca o generics, muda as herancas. há de clarear.

Bruno D'Alessio

unread,
Aug 4, 2010, 12:04:33 PM8/4/10
to dotnetar...@googlegroups.com
Eu passei por isso, o erro da só em runtime né?
Deixa eu da um search aqui no meu cérebro pra ver se lembro.
 
Abs,

Diullei Gomes

unread,
Aug 4, 2010, 2:07:01 PM8/4/10
to dotnetar...@googlegroups.com
Kra @dAlessio o search no cérebro tem que ser otimizado! ta demorando! rs... isso aí funcionou bem pra mim. Eu sou de seguir o conselho do @Gustavo com calma as coisas acontecem!

2010/8/4 Bruno D'Alessio <bruno...@gmail.com>

Bruno D'Alessio

unread,
Aug 4, 2010, 2:11:43 PM8/4/10
to dotnetar...@googlegroups.com
Pois é deu StackOverFlow aqui no meu search recursivo, não consigo lembrar.
Tenta do 0 como o @Gustavo sugeriu, se voltar a dar o erro novamente, tentamos "matar" ele.
 
Boa Sorte,

Daniel Sato

unread,
Aug 4, 2010, 2:35:26 PM8/4/10
to dotnetar...@googlegroups.com
OK vou tentar do zero com calma galera.
Value

Daniel Sato

unread,
Aug 5, 2010, 9:42:17 AM8/5/10
to dotnetar...@googlegroups.com
Bom dia Pessoa
 
Como vcs disseram realmente funciona. Fiz do Zero e funcionou.
Só tem 1 problema agora
 
Quando eu uso o imageList para armazenar as imagens que serão mostradas nos botoes
é ai q ocorre o erro tanto em design como em tempo de execução
 
Ocorre o seguinte erro no método InitializeComponent();
            //
            // imageCollection1
            //
            this.imageCollection1.ImageStream = ((DevExpress.Utils.ImageCollectionStreamer)(resources.GetObject("imageCollection1.ImageStream")));
 
a mensagem de Exceção é a seguinte
"Nenhum recurso adequado para a cultura especificada (ou a cultura neutra) foi encontrado no assembly dado. Verifique se \"MEB.UI.Foms.FrmBase`1.resources\" foi incorporado ou vinculado ao assembly \"MEB.UI\" corretamente no tempo de compilação ou se todos os assemblies satélites necessários podem ser carregados e estão totalmente assinados."
 
Utilizar os Formularios sem icones é impraticável. Alguem saberia como resolver ultimo probleminha (modo de dizer).  rsrs
 
Reply all
Reply to author
Forward
0 new messages