Introdução ao .NET MAUI
Gorjeta
Este conteúdo é um excerto do eBook, Enterprise Application Patterns Using .NET MAUI, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
Independentemente da plataforma, os desenvolvedores de aplicativos corporativos enfrentam vários desafios:
- Requisitos do aplicativo que podem mudar ao longo do tempo.
- Novas oportunidades de negócio e desafios.
- Feedback contínuo durante o desenvolvimento que pode afetar significativamente o escopo e os requisitos do aplicativo.
Com isso em mente, é importante criar aplicativos que possam ser facilmente modificados ou estendidos ao longo do tempo. Projetar para essa adaptabilidade pode ser difícil, pois requer uma arquitetura que permita que partes individuais do aplicativo sejam desenvolvidas e testadas de forma independente isoladamente, sem afetar o resto do aplicativo.
Muitos aplicativos corporativos são suficientemente complexos para exigir mais de um desenvolvedor. Pode ser um desafio significativo decidir como projetar um aplicativo para que vários desenvolvedores possam trabalhar efetivamente em diferentes partes do aplicativo de forma independente, garantindo que as partes se unam perfeitamente quando integradas ao aplicativo.
A abordagem tradicional para projetar e criar um aplicativo resulta no que é conhecido como um aplicativo monolítico, onde os componentes são firmemente acoplados sem separação clara entre eles. Normalmente, essa abordagem monolítica leva a aplicativos que são difíceis e ineficientes de manter, porque pode ser difícil resolver bugs sem quebrar outros componentes no aplicativo, e pode ser difícil adicionar novos recursos ou substituir recursos existentes.
Uma solução eficaz para esses desafios é particionar um aplicativo em componentes discretos e fracamente acoplados que podem ser facilmente integrados em um aplicativo. Esta abordagem oferece várias vantagens:
- Ele permite que a funcionalidade individual seja desenvolvida, testada, estendida e mantida por diferentes indivíduos ou equipes.
- Ele promove a reutilização e uma separação clara de preocupações entre os recursos horizontais do aplicativo, como autenticação e acesso a dados, e os recursos verticais, como a funcionalidade de negócios específica do aplicativo. Isso permite que as dependências e interações entre os componentes do aplicativo sejam gerenciadas mais facilmente.
- Ele ajuda a manter uma separação de funções, permitindo que diferentes indivíduos, ou equipes, se concentrem em uma tarefa específica ou peça de funcionalidade de acordo com sua experiência. Em particular, ele fornece uma separação mais limpa entre a interface do usuário e a lógica de negócios do aplicativo.
No entanto, há muitos problemas que devem ser resolvidos ao particionar um aplicativo em componentes discretos e com acoplamento flexível. Estes são, entre outros:
- Decidir como fornecer uma separação clara de preocupações entre os controles da interface do usuário e sua lógica. Uma das decisões mais importantes ao criar um aplicativo empresarial .NET MAUI é colocar a lógica de negócios em arquivos code-behind ou criar uma separação clara de preocupações entre os controles da interface do usuário e sua lógica, a fim de tornar o aplicativo mais fácil de manter e testável. Para obter mais informações, consulte Model-View-ViewModel.
- Determinar se um contêiner de injeção de dependência deve ser usado. Os contêineres de injeção de dependência reduzem o acoplamento de dependência entre objetos, fornecendo um recurso para construir instâncias de classes com suas dependências injetadas e gerenciar sua vida útil com base na configuração do contêiner. Para obter mais informações, consulte Injeção de dependência.
- Escolher entre plataforma fornecida evento e comunicação baseada em mensagem fracamente acoplada entre componentes que são inconvenientes para vincular por objeto e referências de tipo. Para obter mais informações, consulte Introdução à comunicação entre componentes com acoplamento flexível.
- Decidir como navegar entre páginas, incluindo como invocar a navegação, e onde a lógica de navegação deve residir. Para obter mais informações, consulte Navegação.
- Determinar como validar a entrada do usuário para a correção. A decisão deve incluir como validar a entrada do usuário e como notificá-lo sobre erros de validação. Para obter mais informações, consulte Validação.
- Decidir como executar a autenticação e como proteger os recursos com autorização. Para obter mais informações, consulte Autenticação e autorização.
- Determinar como acessar dados remotos de serviços Web, incluindo como recuperar dados de forma confiável e como armazenar dados em cache. Para obter mais informações, consulte Acessando dados remotos.
- Decidir como testar a aplicação. Para obter mais informações, consulte Teste de unidade.
Este guia fornece orientação sobre esses problemas e se concentra nos principais padrões e arquitetura para criar um aplicativo corporativo de plataforma cruzada usando .NET MAUI. A orientação visa ajudar a produzir código adaptável, sustentável e testável, abordando cenários comuns de desenvolvimento de aplicativos corporativos .NET MAUI e separando as preocupações de apresentação, lógica de apresentação e entidades por meio do suporte ao padrão Model-View-ViewModel (MVVM).
Aplicação de exemplo
Este guia inclui um aplicativo de exemplo, eShop, que é uma loja online que inclui a seguinte funcionalidade:
- Autenticação e autorização em um serviço de back-end.
- Navegando em um catálogo de itens.
- Filtrando o catálogo.
- Encomendar itens do catálogo.
- Visualização do histórico de pedidos do usuário.
- Configuração de definições.
Exemplo de arquitetura de aplicativo
Abaixo está uma visão geral de alto nível da arquitetura do aplicativo de exemplo.
O aplicativo de exemplo é fornecido com:
- .NET Aspire App Hosting & Orquestração
- Uma aplicação web Blazor desenvolvida com ASP.NET Core.
- Um aplicativo multiplataforma desenvolvido com .NET MAUI, que suporta iOS, Android, macOS via Mac Catalyst e Windows.
O aplicativo de exemplo inclui os seguintes serviços de back-end:
- Um microsserviço de identidade, que usa ASP.NET Core Identity e IdentityServer.
- Um microsserviço de catálogo, que é um serviço de criação, leitura, atualização, exclusão (CRUD) orientado por dados que consome um banco de dados do SQL Server usando o EntityFramework Core.
- Um microsserviço de ordenação, que é um serviço controlado por domínio que usa padrões de design controlados por domínio.
- Um microsserviço de cesto, que é um serviço CRUD orientado por dados que usa o Cache Redis.
Esses serviços de back-end são implementados como microsserviços usando o ASP.NET Core e são implantados como contêineres exclusivos com o .NET Aspire. Coletivamente, esses serviços de back-end são chamados de aplicativo de referência eShop. Os aplicativos cliente se comunicam com os serviços de back-end por meio de uma interface da Web REST (Representational State Transfer). Para obter mais informações sobre microsserviços e contêineres, consulte Microsserviços em contêineres.
Aplicação multiplataforma
Este guia se concentra na criação de aplicativos corporativos multiplataforma usando .NET MAUIe usa o aplicativo multiplataforma eShop como exemplo. A imagem abaixo mostra as páginas do aplicativo multiplataforma eShop que fornecem a funcionalidade descrita anteriormente.
O aplicativo multiplataforma consome os serviços de back-end fornecidos pelo aplicativo de referência eShop. No entanto, ele pode ser configurado para consumir dados de serviços fictícios para aqueles que desejam evitar a implantação dos serviços de back-end.
O aplicativo multiplataforma eShop exerce a seguinte funcionalidade .NET MAUI :
- XAML
- Controlos
- Enlaces
- Conversores
- Estilos
- Animações
- Comandos
- Comportamentos
- Acionadores
- Efeitos
- Controlos Personalizados
Para obter mais informações sobre essa funcionalidade, consulte a documentação do .NETMAUI.
Além disso, testes de unidade são fornecidos para algumas das classes no aplicativo multiplataforma eShop.
Solução de aplicativo multiplataforma
A solução de aplicativo multiplataforma eShop organiza o código-fonte e outros recursos em vários projetos. Todos os principais componentes móveis estão contidos em um projeto singular chamado eShopContainers. Este é um recurso introduzido com o .NET 6 que permite que um projeto direcione várias saídas, o que ajuda a eliminar a necessidade de vários projetos de plataforma que teríamos usado no Xamarin.Forms e em versões anteriores do .NET. Um projeto adicional está incluído para testes de unidade.
Embora este projeto tenha todos os seus componentes armazenados em um projeto singular, vale a pena considerar separá-lo em vários projetos com base em suas necessidades. Por exemplo, se você tiver várias implementações de provedores de serviços baseados em um serviço com suas próprias dependências, pode fazer sentido dividir essas implementações de provedor de serviços em seu próprio projeto separado. Bons candidatos para separação de projetos incluem modelos compartilhados, implementações de serviços, componentes de cliente de api, banco de dados ou camadas de cache. Qualquer lugar onde você sinta que a empresa poderia reutilizar um componente em outro projeto é um potencial candidato à separação. Esses projetos podem ser empacotados via NuGet para facilitar a distribuição e o controle de versão.
Todos os projetos usam pastas para organizar o código-fonte e outros recursos em categorias. As classes do aplicativo multiplataforma eShop podem ser reutilizadas em qualquer aplicativo .NET MAUI com pouca ou nenhuma modificação.
Projeto eShop
O projeto eShop contém as seguintes pastas:
Pasta | Description |
---|---|
Animações | Contém classes que permitem que animações sejam consumidas em XAML. |
Comportamentos | Contém comportamentos que são expostos a classes de exibição. |
Controlos | Contém controles personalizados usados pelo aplicativo. |
Conversores | Contém conversores de valor que aplicam lógica personalizada a uma associação. |
Exceções | Contém o ServiceAuthenticationException personalizado. |
Extensões | Contém métodos de extensão para as VisualElement classes e IEnumerable<T> . |
Ajudantes | Contém classes auxiliares para o aplicativo. |
Modelos | Contém as classes de modelo para o aplicativo. |
Propriedades | Contém AssemblyInfo.cs, um arquivo de metadados de assembly .NET. |
Serviços | Contém interfaces e classes que implementam serviços fornecidos ao aplicativo. |
Acionadores | Contém o gatilho BeginAnimation, que é usado para invocar uma animação em XAML. |
Validações | Contém classes envolvidas na validação da entrada de dados. |
ViewModels | Contém a lógica do aplicativo exposta às páginas. |
Vistas | Contém as páginas do aplicativo. |
Resumo
As ferramentas e plataformas de desenvolvimento de aplicativos multiplataforma multiplataforma da Microsoft fornecem uma solução abrangente para aplicativos clientes móveis B2E, B2B e B2C, fornecendo a capacidade de compartilhar código em todas as plataformas de destino (iOS, macOS, Android e Windows) e ajudando a reduzir o custo total de propriedade. Os aplicativos podem compartilhar a interface do usuário e o código lógico do aplicativo, mantendo a aparência da plataforma nativa.
Os desenvolvedores de aplicativos corporativos enfrentam vários desafios que podem alterar a arquitetura do aplicativo durante o desenvolvimento. Portanto, é importante criar um aplicativo para que ele possa ser modificado ou estendido ao longo do tempo. Projetar para essa adaptabilidade pode ser difícil, mas normalmente envolve particionar um aplicativo em componentes discretos e fracamente acoplados que podem ser facilmente integrados juntos em um aplicativo.