none
problema de visibilidade de métodos shared. RRS feed

  • Pergunta

  • Oi galera

    Deparei com um problema, estou querendo saber se tem solução, se não tiver solução, vou ter que mudar a arquitetura da aplicação, veja os cenários:

    solution PROJETOA
    -projetoA - windows aplicaction
    -- classe formAa - tem metodos publicos shared
    -- classe formAb - tem acesso aos metodos shared de formAa
    -- classe formAc - tem acesso aos metodos shared de formAa
    -- classAd          - tem acesso aos metodos shared de formAa
    então todas as classes do projetoA tem acesso aos metodos shared da classe formAa porque estão dentro do mesmo assemblt projetoA.exe, agora o cenário problemático:

    solution PROJETOB
    - projetoB - windows aplication
    -- classe formBa - tem métodos shared
    - projetoC - class library
    -- classe formCa - tem que acessar os metodos shared da classe formBa, mas não acessa.
    - projetoD - class library
    -- classe formDa - tem que acessar os metodos shared da classe formBa. mas não acessa. 

    Do ponto de vista do projetoB sem problema porque posso referenciar os assembly do projetoC e D, mas do ponto de vista do projedtoC ou de projeto D, não consigo enxergar os métodos shared do projetoB   porque não tem como referencia-lo neste, até onde eu conheço. Estive pensando no tal do GAC mas não tenho ideia se funcionaria para esse tipo de problema. Alguem já passou por problema similar? e como foi resolvido? se ´puderem me ajudar a resolver este problema agradeço um tanto.
    NOTA: estou colocando este problema tambem no tópico .net development geral
    takeo

    segunda-feira, 17 de dezembro de 2007 00:30

Respostas

  • Takeo, acho que você terá que mudar a arquitetura mesmo.

    Crie outro projeto class library para armazenar os métodos shared.

    Com isso, você consegue referencia-lo em todos os outros projetos da solução.

     

    Abraços,

    Fábio Nascimento -  MCP - Vb.Net

    terça-feira, 18 de dezembro de 2007 12:09
  • Caro Takeo, Não irei discutir a arquitetura da sua aplicacao, pois nao conheco detalhes da mesma, no entanto não concordo da forma que está coordenando a mesma, porém é possível sem mudar nada, fazer o que deseja:

     

    Solution1

    ProjectA

    Code Block

    Public Class ClassAa

    Public Shared Sub methodAa()

    ''corpo do metodo.

    End Sub

    End Class

     

     

    Code Block

    Public Class ClassAb

    Public Sub methodAb()

    ''chamando metodos dentro do proprio assembly.

    ProjectA.ClassAa.methodAa()

    End Sub

    End Class

     

     

    Solution2

    ProjectB

    Code Block

    Public Class ClassBa

    Public Shared Sub methodBa()

    ''corpo do metodo

    End Sub

    End Class

     

     

    ProjectC

    Code Block

    Public Class ClassCa

    Public Sub methodCa()

    ''chamando o metodo shared do Projecto B, ap¢s adicionar sua referencia ao Projeto C.

    ProjetoB.ClassBa.methodBa()

    End Sub

    End Class

     

     

    ProjectD

    Code Block

    Public Class ClassDa

    Public Sub methodDa()

    ''chamando o metodo shared do Projecto B, ap¢s adicionar sua referencia ao Projeto D.

    ProjetoB.ClassBa.methodBa()

    ''inclusive posso fazer chamadas ao metodo shared da ClasseAa Projeto A, ap¢s adicionar sua referencia ao Projeto D, mesmo tendo o output do projeto como um EXE.

    ProjectA.ClassAa.methodAa()

    End Sub

    End Class

     

     

    A questão de ser Shared nao implica na visibilidade da Classe/Metodo, e sim a forma como ele é acessado, se a partir de uma instancia de um objeto ( obj.Metodo() ), ou a partir da forma estatica do metodo ( ClasseA.Metodo() )

     

    Existem algumas formas de arquitetar este tipo de solução, suas camadas e estrutura, mas tudo depende dos requisitos do seu projeto. Neste caso tome cuidado com as referencias, para nao crias referencias/dependencias circulares.

     

    Até mais,

     

    Marconi Silva

    terça-feira, 18 de dezembro de 2007 22:43

Todas as Respostas

  • Takeo, acho que você terá que mudar a arquitetura mesmo.

    Crie outro projeto class library para armazenar os métodos shared.

    Com isso, você consegue referencia-lo em todos os outros projetos da solução.

     

    Abraços,

    Fábio Nascimento -  MCP - Vb.Net

    terça-feira, 18 de dezembro de 2007 12:09
  • Caro Takeo, Não irei discutir a arquitetura da sua aplicacao, pois nao conheco detalhes da mesma, no entanto não concordo da forma que está coordenando a mesma, porém é possível sem mudar nada, fazer o que deseja:

     

    Solution1

    ProjectA

    Code Block

    Public Class ClassAa

    Public Shared Sub methodAa()

    ''corpo do metodo.

    End Sub

    End Class

     

     

    Code Block

    Public Class ClassAb

    Public Sub methodAb()

    ''chamando metodos dentro do proprio assembly.

    ProjectA.ClassAa.methodAa()

    End Sub

    End Class

     

     

    Solution2

    ProjectB

    Code Block

    Public Class ClassBa

    Public Shared Sub methodBa()

    ''corpo do metodo

    End Sub

    End Class

     

     

    ProjectC

    Code Block

    Public Class ClassCa

    Public Sub methodCa()

    ''chamando o metodo shared do Projecto B, ap¢s adicionar sua referencia ao Projeto C.

    ProjetoB.ClassBa.methodBa()

    End Sub

    End Class

     

     

    ProjectD

    Code Block

    Public Class ClassDa

    Public Sub methodDa()

    ''chamando o metodo shared do Projecto B, ap¢s adicionar sua referencia ao Projeto D.

    ProjetoB.ClassBa.methodBa()

    ''inclusive posso fazer chamadas ao metodo shared da ClasseAa Projeto A, ap¢s adicionar sua referencia ao Projeto D, mesmo tendo o output do projeto como um EXE.

    ProjectA.ClassAa.methodAa()

    End Sub

    End Class

     

     

    A questão de ser Shared nao implica na visibilidade da Classe/Metodo, e sim a forma como ele é acessado, se a partir de uma instancia de um objeto ( obj.Metodo() ), ou a partir da forma estatica do metodo ( ClasseA.Metodo() )

     

    Existem algumas formas de arquitetar este tipo de solução, suas camadas e estrutura, mas tudo depende dos requisitos do seu projeto. Neste caso tome cuidado com as referencias, para nao crias referencias/dependencias circulares.

     

    Até mais,

     

    Marconi Silva

    terça-feira, 18 de dezembro de 2007 22:43
  • Oi Marconi
    Bem legal sua explanação e demonstração, aliás copiei a demonstração para dar uma estudada melhor. O problema que ocorreu, foi exatamente a DEPENDENCIA CIRCULAR, porque a classe Ba necessita referenciar as projetos Ca, Da e outras classes de outros projetos na solução. E cada um destes projetos precisa acessar os métodos e eventos do projeto Ba por ser este é um projeto gerenciador, mas para isso precisa da referencia, daí a dependência circular. Seguindo a sugestão do Fabio do post anterior, fiz uma remodelagem da arquitetura, deu um pouco de trabalho mas não foi dificil, todo projeto passou a ser classLabray:
    solução 2
    projetoBa - camada de gerenciamento
                  - camada de apresentação (todas as classes de apresentação que estavam nos demais projetos da solução
                    passei para esta camada) que representa a UI.
    projetoCa - ficom com as regras de negocio.
    projetoDa - ficou com as regras de negocio
    Com isso, todo o problema de dependencia circular ficou confinado dentro de um único assembly, o projeto Ba, resolvendo o problema de dependencia circular.
    Agora criei um novo projeto que chamei de projetoStart do tipo consoleAplication para startar a aplicação e exibir o form principal que está no assembly projetoBa. A aplicação foi startado, porém a janela Command aparece na frente do formulário, tem ideia como desabilitar a janela COMMAND? ou tem uma outra alternativa de startar a aplicação?.  Aliás coloquei um post sobre este problema hoje.
    ADENDO: A da arquitura inicial era de que cada módulo ou opção do menu seria disparado uma aplicação completa de 3 camadas: UI, negocio e acesso a dados, e o form principal seria uma especie de shel, esta ideia já está descartada com mudança que fiz acima. É isso aí,
    quero desejar a você, ao Fabio e demais colegas que  gentilmente  atenderam ao post, um feliz natal e um ano novo cheio de força, paz e muito trabalho que vai dar muito dinheiro no bolso de cada um.
    takeo

     



    .
                 



                     
    sábado, 22 de dezembro de 2007 03:12