
Создание приложения для книжного магазина с полным стеком за 100 дней с .NET MAUI и чистой архитектурой
27 июня 2025 г.Для моего окончательного университетского проекта я поступил с амбициозной целью: создать комплексную систему управления книжным магазином примерно за 50 дней. Задача заключалась не в том, чтобы создать приложение для электронной коммерции, но и создать унифицированное решение, которое обслуживает онлайн-клиентов, сотрудников в магазине и системных администраторов, из одного, современного мобильного приложения. Это история о том, как я воплотил эту идею в жизнь, используя подход .NET с полным стеком, сочетая надежный бэкэнд Asp.net Web API с красивой, кросс-платформой .NET .NET. Попутно я использовал архитектурные решения, занимался реальной бизнес-логикой и усвоил неоценимые уроки.
Проблема: отключенный книжный магазин
Традиционные книжные магазины часто борются с цифровым разделением. У них может быть простой интернет-магазин, но система в магазине (POS), управление запасами и данные о взаимоотношениях с клиентами часто полностью отделены. Это создает неэффективность, от неточных уровней запасов до разрозненного опыта клиентов. Моя цель состояла в том, чтобы решить это, создав единую, сплоченную экосистему, где:
- Клиенты могут просматривать, покупать и управлять своей учетной записью в Интернете.
- Персонал может обрабатывать продажи в магазине и управлять запасами непосредственно с мобильного устройства.
- Администраторы могли бы контролировать всю операцию, от управления продукцией до отчетов о продажах в любое время и в любом месте. Выбор .NET MAUI для клиента и ASP.NET CORE для API было естественным соответствием. Это позволило мне использовать свои навыки C# по всему стеку и создать по-настоящему нативное кроссплатформенное приложение для Android, iOS и Windows из одной кодовой базы.
Бэкэнд: строительство прочной основы с чистой архитектурой
Перед тем, как один пиксель был нарисован на пользовательском интерфейсе, я знал, что бэкэнд должен быть надежным, масштабируемым и тестируемым. Я решил внедрить чистую архитектуру, дизайн, который обеспечивает строгое разделение проблем и четкий поток зависимости.
Вот как это структурировано:
- Доменное слой: ядро системы. Он содержит наши деловые объекты (книга, заказ, пользователь), перечисления и репозиторий. Этот уровень имеет нулевые зависимости от любой структуры или технологии базы данных. Это чистый бизнес.
- Приложенный слой: этот слой организует варианты использования. Он определяет логику приложения через Сервисы (например, Iorderservice), обрабатывает DTOS, определяет правила проверки с FluentValidation и содержит профили Authapper. Это зависит только от домена.
- Инфраструктурный слой: «клей» к внешнему миру. Он содержит детали реализации, такие как ApplicationDBContext (с использованием EF Core), реализации репозитория, которые общаются с SQL Server, и службы для взаимодействия с внешними системами, такими как Google Cloud Storage для хостинга изображений. Он реализует интерфейсы, определенные в слоях внутри него.
- Презентационный слой (API): самый внешний слой, разоблачая нашу систему миру с помощью Restful Endpoints и Hub SignalR (для будущих функций в реальном времени). Он содержит контроллеры, которые обрабатывают HTTP -запросы и ответы. Эта архитектура была не только теоретической; Это сразу окупилось. Например, использование репозитория и единицы рабочих шаблонов означало, что моя логика приложения никогда не знала, что он разговаривает с SQL Server. Я мог бы поменять технологию базы данных в будущем, не касаясь основных бизнес -правил.
The Frontend: современный, кроссплатформенный опыт с .NET MAUI
С солидным API пришло время построить клиента. Целью было современное, интуитивно понятное и исполнительское приложение. I использовал шаблон MVVM (Model-View-ViewModel) для достижения чистого разделения между пользовательским интерфейсом (представление) и логикой приложения (ViewModel).
Ключевые компоненты архитектуры Мауи включают:
- .Net Maui Shell: я использовал Shell, чтобы создать последовательную и мощную навигационную структуру, включая меню Flyout. Самая лучшая часть? Я мог бы динамически показать или скрыть элементы меню (например, «панель администратора») на основе роли пользователя, которая была определена после того, как они вошли в систему.
- MVVM Toolkit: Эта библиотека была спасателем. Такие особенности, как [ObservableProperty] и [RelayCommand], резко снизили код шаблона в моих ViewModels, что позволяет мне сосредоточиться на состоянии и логике приложения.
- Переоборудование: Вместо ручного создания запросов HTTPClient я использовал Refit для создания, защищенных типами, декларативными клиентами API. Я просто определяю интерфейс и переоборудован обрабатывает реализацию.
- Централизованное государственное управление: Authservice Singleton управляет состоянием входа в систему, токеном JWT (хранится в Securestorage) и текущей информации пользователя, что делает его доступным во всем приложении. AuthheaderHandler автоматически прикрепляет токен ко всем соответствующим запросам API.
- Визуализация данных: чтобы обеспечить реальную ценность для администраторов, я интегрировал микрочарты .maui, чтобы создать простые, но эффективные диаграммы для отчетов, таких как тенденции доходов и бестселлеры, превращая необработанные данные в действие непосредственно на их мобильном устройстве.
Ключевые функции
Окончательное приложение успешно поддерживает три различных пользовательских роли с адаптированным опытом:
- Поток клиентов: от просмотра продуктов и добавления в корзину до многоэтапного процесса оформления заказа с выбором адреса и просмотра истории заказа.
- Поток персонала: обеспечивает операции в магазине, такие как создание заказов для клиентов и управление запасами путем создания квитанций о акциях непосредственно из приложения.
- Административный поток: предоставляет комплексный обзор с помощью панели панели и подробных отчетов. Администраторы могут управлять всем каталогом продуктов, категорий, авторов, рекламных акций и пользователей.
Приложение имеет более 70 стандартных конечных точек API REST, полностью отвечающие основным требованиям для эффективной системы управления книжным магазином.
Проблемы и уроки извлечены
Ни один проект не без проблем. Мои самые большие учебные моменты пришли от:
- Борьба с асинхронной сложностью: жонглирование множественными асинхровыми вызовами (например, загрузка данных для страницы оформления заказа) и обновление пользовательского интерфейса было главным препятствием. Я узнал о том, что я узнал о важности использования mainthread.begininvokeonmainthread и создания надежного управления государством с флагами Isbusy для обеспечения плавного пользовательского опыта.
- Навигационные причуды Maui Shell: я столкнулся с исключениями «неоднозначного маршрута» при использовании относительной навигации (..). Исследенный урок должен был быть очень явным с моими маршрутами, часто используя абсолютную навигацию (// домашняя страница/категории/…), чтобы обеспечить ясность и избежать путаницы в стеке навигации.
- «Почему» чистой архитектуры: изначально архитектура напоминала излишке. Но когда мне пришлось изменить схему базы данных или добавить новые бизнес-правила (например, обработка заказов в магазине), я действительно оценил это. Я мог бы внести изменения в один слой с минимальным воздействием на других, что сэкономило мне огромное количество времени и предотвратила новые ошибки.
Заключение и следующие шаги
Всего за 100 дней я успешно создал полное кроссплатформенное приложение, которое решает реальную проблему для книжных магазинов. Это путешествие укрепило мое понимание современной разработки .NET, от проектирования надежных, тестируемых бэкэндов с чистой архитектурой до создания красивых, отзывчивых блюд с .NET MAUI и MVVM. Хотя основная функция завершена, путешествие не закончилось. Следующими шагами будет внедрение комплексного автоматического набора тестирования (модульные и интеграционные тесты), интеграцию реального платежного шлюза и создать конвейер CI/CD для развертывания.
Вы можете найти полный исходный код на моем GitHub:
API Backend (Core ASP.NET):https://github.com/hoangnguyenn26/bookstoremanagemage-api
Клиентское приложение (.net maui):https://github.com/hoangnguyenn26/bookstoremobileСпасибо за чтение! Я хотел бы услышать ваши мысли, отзывы или любые вопросы, которые у вас могут возникнуть в комментариях ниже
Оригинал