Skip to content

6. Spring para configurar aplicações de três camadas

Aqui, vamos usar um exemplo para explorar como o Spring pode ser usado para configurar aplicações de três camadas. Um exemplo comum deste tipo de aplicação são as aplicações web.

6.1. O Problema

Queremos construir uma aplicação de três camadas com a seguinte estrutura:

  • As três camadas serão tornadas independentes através da utilização de interfaces
  • A integração das três camadas será gerida pelo Spring
  • Criaremos pacotes separados para cada uma das três camadas, aos quais daremos os nomes [control], [domain] e [dao]. Um pacote adicional, [tests], conterá as aplicações de teste.

6.2. A Camada de Acesso aos Dados

A camada DAO irá implementar a seguinte interface:

Namespace istia.st.spring3tier.dao
    Public Interface IDao
        ' do something in the diaper [dao]
        Function doSomethingInDaoLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escreva duas classes, Dao1Impl1 e Dao1Impl2, que implementem a interface IDao. O método Dao1Impl1.doSomethingInDaoLayer irá devolver a+b, e o método Dao1Impl2.doSomethingInDaoLayer irá devolver a-b.
  • Escreva uma classe de teste NUnit para testar as duas classes anteriores

6.3. A camada de negócios

A camada de negócios irá implementar a seguinte interface:

Namespace istia.st.spring3tier.domain
    Public Interface IDomain
        ' do something in the [domain] layer
        Function doSomethingInDomainLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escreva duas classes, Domain1Impl1 e Domain1Impl2, que implementem a interface IDomain. Estas classes terão um campo privado do tipo IDao que pode ser inicializado através de uma propriedade pública. O método doSomethingInDomainLayer da classe [DomainImpl1] incrementará a e b em um, passando depois estes dois parâmetros para o método doSomethingInDaoLayer do objeto IDao1 recebido. O método doSomethingInDomainLayer da classe [Domain1Impl2] decrementará a e b em um antes de fazer o mesmo.
  • Escreva uma classe de teste NUnit para testar as duas classes anteriores

6.4. A camada de interface do utilizador

A camada de interface do utilizador irá implementar a seguinte interface:

Namespace istia.st.spring3tier.control
    Public Interface IControl
        ' do something in the [control] layer
        Function doSomethingInControlLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escreva duas classes, Control1Impl1 e Control1Impl2, que implementem a interface IControl1. Estas classes terão um campo privado do tipo IDomain que pode ser inicializado através de uma propriedade pública. O método doSomethingInControlLayer da classe [Control1Impl1] incrementará a e b em um, passando depois estes dois parâmetros para o método doSomethingInDomainLayer do objeto IDomain1 recebido. O método doSomethingInControlLayer da classe [Control1Impl2], por outro lado, decrementará a e b em um antes de fazer o mesmo.
  • Escreva uma classe de teste NUnit para testar as duas classes anteriores

6.5. Integração com o Spring

  • Escreva um ficheiro de configuração Spring que determinará quais as classes que cada uma das três camadas anteriores deve utilizar
  • Escreva uma classe de teste NUnit utilizando diferentes configurações Spring para destacar a flexibilidade da aplicação
  • Escreva uma aplicação autónoma (método main) que passe dois parâmetros para o método [doSomethingInControlLayer] da interface IControl implementada e exiba o resultado devolvido pela interface.