ACESSAR OBJETO DE OUTRO PROJETO DENTRO DA SOLUÇÃO

 Tópico anterior Próximo tópico Novo tópico

ACESSAR OBJETO DE OUTRO PROJETO DENTRO DA SOLUÇÃO

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#485170 - 02/11/2018 07:35:00

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017



Oi a todos, preciso de uma pequena explicação!

Antes quero deixar claro, que busquei por muita coisa no Google... Mas até então eu não conseguir
encontrar a solução para minha dúvida!

Eu possuo um projeto de 3 camadas, Apresentação, Negócios , Dados:

A camada apresentação é do tipo Windows Form, enquanto as outras são biblioteca de classes. E
por isso, ela não gera os arquivos dll como das outras!

O que acontece, é que eu preciso acessar dentro da minha camada negócios, os objetos da
camada apresentação, mas como posso fazer isso se ela não gera a dll?

Existe uma forma de referenciar ela na camada negócios?

A unica solução que encontrei para isso, foi criar uma outra camada... POREM...., tive alguns
problemas por conta disso, e vejo que não seria a melhor alternativa também!










#485171 - 02/11/2018 08:35:37

SONILDO
CAMPO GRANDE
Cadast. em:Agosto/2009


Não entendi
Eu programo OOP há bastante tempo gostaria de saber o que realmente deseja

Eu uso OOP da seguinte forma
1. Camada 'Model' = responsável para repassar as informações da tela para a camada 'Business'.
2. Camada 'Business' = camada intermediaria entre model/Data.
3. Camada 'Data' / 'dbConnecton' = responsável para guardar as informações da camada model.

Como seria a sua lógica



#485173 - 02/11/2018 09:31:04

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Última edição em 02/11/2018 09:32:52 por WELISSON

Citação:
:
Não entendi
Eu programo OOP há bastante tempo gostaria de saber o que realmente deseja

Eu uso OOP da seguinte forma
1. Camada 'Model' = responsável para repassar as informações da tela para a camada 'Business'.
2. Camada 'Business' = camada intermediaria entre model/Data.
3. Camada 'Data' / 'dbConnecton' = responsável para guardar as informações da camada model.

Como seria a sua lógica


SONILDO, obrigado por responder!

Então o meu é igual o seu, porem me explica uma coisa... Se dentro
da camada Business, você precisar acessar um objeto da
model como que faz?

Pois no meu caso eu não tenho acesso ao formulário, e eu preciso de ter acesso
a ele...  Como disse, minha camada Model é do tipo WindowsForm e não
biblioteca de classes entendeu?

Se ele fosse biblioteca de classes, eu poderia importa-la na camada Business...

Não sei se conseguir ser claro...













#485174 - 02/11/2018 11:59:53

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
:
Não entendi
Eu programo OOP há bastante tempo gostaria de saber o que realmente deseja

Eu uso OOP da seguinte forma
1. Camada 'Model' = responsável para repassar as informações da tela para a camada 'Business'.
2. Camada 'Business' = camada intermediaria entre model/Data.
3. Camada 'Data' / 'dbConnecton' = responsável para guardar as informações da camada model.

Como seria a sua lógica

SONILDO, obrigado por responder!

Então o meu é igual o seu, porem me explica uma coisa... Se dentro
da camada Business, você precisar acessar um objeto da
model como que faz?

Pois no meu caso eu não tenho acesso ao formulário, e eu preciso de ter acesso
a ele...  Como disse, minha camada Model é do tipo WindowsForm e não
biblioteca de classes entendeu?

Se ele fosse biblioteca de classes, eu poderia importa-la na camada Business...

Não sei se conseguir ser claro...











Voce não tem que ter acesso a objetos da camada APRESENTAÇÃO, é ela que tem que ter acesso as outras camadas...
Neste caso vc precisa alimentar a camada adequada com as informações vindas do formulário.

Em alguns casos faz-se necessário a criação de mais uma camada auxiliar.
Então chamamos esse tipo de projeto onde tenha mais de 3 camadas de N-Tier.






Grupo DotNet.Br no FaceBook



#485175 - 02/11/2018 12:35:59

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Última edição em 02/11/2018 12:40:21 por WELISSON

]
Citação:
Voce não tem que ter acesso a objetos da camada APRESENTAÇÃO, é ela que tem que ter acesso as outras camadas...
Neste caso vc precisa alimentar a camada adequada com as informações vindas do formulário.

Em alguns casos faz-se necessário a criação de mais uma camada auxiliar.
Então chamamos esse tipo de projeto onde tenha mais de 3 camadas de N-Tier.



FOXMAN obrigado pro me responder!

Então era essa minha dúvida:

Pois eu tenho uma função no meu projeto para realizar a exclusão de vários
registros no banco de dados!

No modelo tradicional, era só percorrer meu datagrid
Pegar o ID do registro a ser excluído e fazer a exclusão
e pronto!

Já no 3 camadas para fazer isso eu preciso:

1 - Percorrer o grid
2 - Passar as informações para um DataTable (OU Array)
3 - Passa esse DataTable como parâmetro para negócios
4 - Que passa como parâmetro a camada dados
5 - Que que percorre o DataTable recebido
6 - Fazendo então a exclusão

Ai que to PENSANDO, estou fazendo papel de imbecil?

Esse é meu medo, pois pensei que se tivesse acesso ao objeto
não precisaria fazer o primeiro passo!

Agora se existe uma forma mais simples de fazer exclusão, por favor
alguém me dica kk!

Mas isso é um dúvida para próximo tópico, mesmo assim muito obrigado!




#485183 - 03/11/2018 10:31:14

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe

Última edição em 03/11/2018 10:33:21 por FOXMAN

Basicamente eu faria da seguinte maneira....

1 - Percorrer o grid e ir populando um objeto do tipo desejado da classe negocio(assegurando que as regras de negocio sejam aplicadas)
2 - Na classe negocio, fazer instancia ao classe dados, chamando o método responsável para exclusão, passando como parametro o objeto populado.
3 - Na Classe Dados, executar a exclusão com base nos dados que foram passados como parametro.













Grupo DotNet.Br no FaceBook



#485186 - 03/11/2018 22:36:35

SONILDO
CAMPO GRANDE
Cadast. em:Agosto/2009


Exemplos das Camada

1. Model
Public Class Pessoa
    Public Property Nome As String = String.Empty
    Public Property Endereco As String = String.Empty
End Class

2. Business
Public Class Pessoa
    Public Function Insert(ByVal oCustomers As Model.Customers) As Long
        Dim db As Data.Pessoa = New Data.Pessoa()

        Try
            Return db.Insert(oPessoa)
        Catch ex As Exception
            Throw ex
        Finally
            db = Nothing
        End Try
    End Function

    Public Function Update(ByVal _oPessoa As Model.Pessoa, ByVal WhereClause As String) As Boolean
        Dim db As System.Data.Pessoa = New Data.Pessoa()

        Try
            Return db.Update(_oPessoa, WhereClause)
        Catch ex As Exception
            Throw ex
        Finally
            db = Nothing
        End Try
    End Function
End Class

3. Data
Imports System.Data.OleDb

Public Class Customers
    Private cmd As OleDbCommand
    Private db As dbConnection

    Public Overloads Function Insert(ByVal ml As Model.Customers) As Integer
        db = New dbConnection
        cmd = New OleDbCommand

        Try
            cmd.CommandText = "INSERT INTO Pessoa(Nome,Endereco) VALUES(?,?)"
            cmd.Connection = db.openConnection()

            With cmd.Parameters
                .AddWithValue("@Nome", ml.Nome.Trim)
                .AddWithValue("@Endereco", ml.Endereco.Trim)
            End With

            cmd.ExecuteNonQuery()
            cmd.Parameters.Clear()
            cmd.CommandText = "SELECT @@IDENTITY"

            Return cmd.ExecuteScalar()
        Catch ex As Exception
            Return 0
            Log(ex.Message, "Pessoa", "Insert")
            Throw ex
        Finally
            db.closeConnection()
            db = Nothing
            cmd = Nothing
        End Try
    End Function

    Public Overloads Function Update(ByVal ml As Model.Customers, ByVal WhereClause As String) As Boolean
        db = New dbConnection
        cmd = New OleDbCommand

        Try
            cmd.CommandText = "UPDATE Pessoa SET Nome=?,Endereco=? " & WhereClause
            cmd.Connection = db.openConnection()

            With cmd.Parameters
                .AddWithValue("@Nome", ml.Nome.Trim)
                .AddWithValue("@Endereco", ml.Endereco.Trim)
            End With

            If (cmd.ExecuteNonQuery() > 0) Then Return True Else Return False
        Catch ex As Exception
            Log(ex.Message, "Pessoa", "Update")
            Throw ex
            Return False
        Finally
            db.closeConnection()
            db = Nothing
            cmd = Nothing
        End Try
    End Function
End Class
'-Outra classe ------------------------
Imports System.Data.OleDb

Public Class dbConnection
    Private Shared cn As OleDbConnection = Nothing
    Private cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Environment.CurrentDirectory & "\Northwind.MDB"

    Public Function openConnection() As OleDbConnection
        cn = New OleDbConnection(cnString)

        Try
            If cn.State = ConnectionState.Closed Then cn.Open()
            Return cn
        Catch ex As Exception
            Return Nothing
            Throw New Exception(ex.Message)
        End Try
    End Function

    Public Sub closeConnection()
        If IsNothing(cn) = False Then
            If cn.State = ConnectionState.Open Then
                cn.Close()
                cn.Dispose()
            End If
            cn = Nothing
        End If
    End Sub
End Class




#485188 - 04/11/2018 09:00:02

NICKOSOFT
SANTO ANDRE
Cadast. em:Maio/2009


Última edição em 04/11/2018 09:03:34 por NICKOSOFT

entenda, qnd vc fazia tudo em um unico projeto, vc percorria esse grid e mandava o resultado provavelmente pra uma funcao q fazia algo, q recorria a outra funcao q acessava os dados, q por fim retornavam a funcao q chamou e essa ao form...
vc separa essas funcoes em projetos, deixando o mais geral possivel......
meus projetos cheguei num crud geral ao extremo pras necessidades q ja tive....
  
    Public Function CRUD(ByVal sql As String, ByVal parameterNames() As String, ByVal parameterVals() As String) As Integer
        Try
            Using connection As MySqlConnection = AbreConexao()
                Using command As New MySqlCommand(sql, connection)
                    FillParameters(command, parameterNames, parameterVals)
                    Return command.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Function CRUD(ByVal sql As String) As Integer
        Try
            Using connection As MySqlConnection = AbreConexao()
                Using command As New MySqlCommand(sql, connection)
                    Return command.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function

    Private Sub FillParameters(ByVal command As MySqlCommand, ByVal parameterNames As String(), ByVal parameterVals As String())
        Try
            If parameterNames IsNot Nothing Then
                For i = 0 To parameterNames.Length - 1
                    command.Parameters.AddWithValue(parameterNames(i), parameterVals(i))
                Next
            End If
        Catch ex As Exception
            Throw
        End Try
    End Sub



isso me atende em todo tipo de crud q preciso......fica guardado na camada de dados....
veja q nao adianta nada vc fazer em 500 camadas, se na camada de dados vc tem 1000 cruds, cada operacao q vc tinha nos formularios vc repete na camada de dados e faz o acesso direcionado.....
essa ideia de camadas seria separar responsabilidades e aproveitamento de codigo, deixar de ter repeticoes, um crud q faca tudo ao inves de um crud por botao nos varios formularios do programa....
qnd parti pro vb.net resolvi aprender dessa forma, e até eu entender e absorver a ideia demorou e deu trabalho.....por isso digo até hj esse crud ai de cima me atende, pode ser q um dia nao resolva, e eu consiga generalizar mais ainda




#485190 - 04/11/2018 14:19:49

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
:
Basicamente eu faria da seguinte maneira....

1 - Percorrer o grid e ir populando um objeto do tipo desejado da classe negocio(assegurando que as regras de negocio sejam aplicadas)
2 - Na classe negocio, fazer instancia ao classe dados, chamando o método responsável para exclusão, passando como parametro o objeto populado.
3 - Na Classe Dados, executar a exclusão com base nos dados que foram passados como parametro.












Obrigado amigo!

Estou estudando, e suas dicas vão ser valiosas pra mim!



#485191 - 04/11/2018 14:25:18

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:

Exemplos das Camada


SONILDO

Ótimo exemplo, muito obrigado amigo!

Estarei dando uma olhada aqui!



#485192 - 04/11/2018 14:43:10

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
Public Function CRUD(ByVal sql As String, ByVal parameterNames() As String, ByVal parameterVals() As String) As Integer
        Try
            Using connection As MySqlConnection = AbreConexao()
                Using command As New MySqlCommand(sql, connection)
                    FillParameters(command, parameterNames, parameterVals)
                    Return command.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Function CRUD(ByVal sql As String) As Integer
        Try
            Using connection As MySqlConnection = AbreConexao()
                Using command As New MySqlCommand(sql, connection)
                    Return command.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function

    Private Sub FillParameters(ByVal command As MySqlCommand, ByVal parameterNames As String(), ByVal parameterVals As String())
        Try
            If parameterNames IsNot Nothing Then
                For i = 0 To parameterNames.Length - 1
                    command.Parameters.AddWithValue(parameterNames(i), parameterVals(i))
                Next
            End If
        Catch ex As Exception
            Throw
        End Try
    End Sub



isso me atende em todo tipo de crud q preciso......fica guardado na camada de dados....
veja q nao adianta nada vc fazer em 500 camadas, se na camada de dados vc tem 1000 cruds, cada operacao q vc tinha nos formularios vc repete na camada de dados e faz o acesso direcionado.....
essa ideia de camadas seria separar responsabilidades e aproveitamento de codigo, deixar de ter repeticoes, um crud q faca tudo ao inves de um crud por botao nos varios formularios do programa....
qnd parti pro vb.net resolvi aprender dessa forma, e até eu entender e absorver a ideia demorou e deu trabalho.....por isso digo até hj esse crud ai de cima me atende, pode ser q um dia nao resolva, e eu consiga generalizar mais ainda



Também estou buscando isso amigo, e realmente é vdd o que você disse!

Na camada de dados do meu projeto, eu possuo uma classe para conexão
e uma classe DataBase...

Nessa classe DataBase, seria tipo onde fica as classes das tabelas. Eu achei melhor fazer assim, deixei
meu projeto mais limpo ainda!










 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário