Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Atlas App Services

Tutorial: Atlas Device Sync para .NET con MAUI

Tiempo estimado para completar: 30 minutos, dependiendo de tu experiencia con MAUI

Realm proporciona un SDK .NET para crear aplicaciones multiplataforma en C# con MAUI. Este tutorial se basa en la aplicación de plantilla de sincronización flexible .NET, denominada maui.todo.flex, que ilustra la creación de una aplicación de tareas pendientes en MAUI. Esta aplicación permite a los usuarios:

  • Registrar su correo electrónico como una nueva cuenta de usuario.

  • Inicie sesión en su cuenta con su correo electrónico y contraseña (y cierre sesión).

  • Ver, crear, modificar y eliminar tareas.

En este tutorial, añadirás un nuevo campo Priority al modelo existente Item y actualizarás la suscripción de Sync flexible para mostrar solo los elementos dentro de un rango de prioridades.

Nota

Consulte el inicio rápido

Si prefieres comenzar con tu propia aplicación en lugar de seguir un tutorial guiado, consulta la Guía de inicio rápido de .NET. Incluye ejemplos de código copiables y la información esencial necesaria para configurar un backend de Atlas App Services.

  • Asegúrese de tener el software necesario instalado. Selecciona la pestaña de tu entorno de desarrollo:

    • Windows 7 o más reciente. Se recomienda Windows 10.

    • Visual Studio 2017 (se 2019 recomienda Visual Studio).

    • Android 6.0 / API level 23.

    • Para crear proyectos de iOS en Windows, también necesitará una computadora Mac, accesible en red desde la computadora Windows, que cumpla con los requisitos mínimos para ejecutar Xamarin en macOS.

  • Necesita experiencia previa implementando una aplicación MAUI o Xamarin en un emulador de Android, simulador de iOS o en un dispositivo físico.

  • Este tutorial comienza con una aplicación de Plantilla. Necesitas una Cuenta de Atlas, una clave API y App Services CLI para crear una aplicación de plantilla.

    • Para obtener más información sobre cómo crear una cuenta de Atlas, consulte la sección Primeros pasos con Atlas. Para este tutorial, necesita una cuenta de Atlas con un clúster de nivel gratuito.

    • También necesita una clave API de Atlas para la cuenta de MongoDB Cloud con la que desea iniciar sesión. Debe ser propietario del proyecto para crear una aplicación de plantilla mediante la CLI de App Services.

    • Para aprender más sobre cómo instalar App Services CLI, consulta Instalar App Services CLI. Después de instalar, ejecuta el comando login utilizando la clave API de tu proyecto Atlas.

Este tutorial se basa en la aplicación de plantilla de sincronización flexible de MAUI llamada maui.todo.flex. Comenzamos con la aplicación predeterminada y desarrollamos nuevas funciones a partir de ella.

Para obtener más información sobre las aplicaciones de plantilla, consulte Aplicaciones de plantilla.

Si aún no tiene una cuenta Atlas, regístrese para implementar una aplicación de plantilla.

Siga el procedimiento descrito en la guía Crear una aplicación de servicios de aplicaciones y seleccione Create App from TemplateSeleccione la plantilla Real-time Sync. Esto crea una aplicación de Servicios de Aplicaciones preconfigurada para usarla con uno de los clientes de la plantilla de Sincronización de Dispositivos.

Después de crear una aplicación plantilla, la Interfaz de Usuario muestra un modal etiquetado como Get the Front-end Code for your Template. Este modal proporciona instrucciones para descargar el código cliente de la aplicación plantilla como un archivo .zip o para usar App Services CLI y obtener el cliente.

Después de seleccionar el método .zip o la CLI de App Services, siga las instrucciones en pantalla para obtener el código de cliente. Para este tutorial, seleccione el código de cliente C# (.NET MAUI).

Nota

La utilidad ZIP predeterminada de Windows podría mostrar el archivo .zip vacío. Si esto ocurre, use un programa de compresión de terceros disponible.

El comando de creación de aplicaciones appservices configura el backend y crea una aplicación de plantilla C# (MAUI) para que la use como base para este tutorial.

Ejecute el siguiente comando en una ventana de terminal para crear una aplicación llamada "MyTutorialApp" que se implementa en la región US-VA con su entorno configurado en "desarrollo" (en lugar de producción o control de calidad).

appservices app create \
--name MyTutorialApp \
--template maui.todo.flex \
--deployment-model global \
--environment development

El comando crea un nuevo directorio en su ruta actual con el mismo nombre que el valor del indicador --name.

Puedes bifurcar y clonar un repositorio de GitHub que contenga el código del cliente de Device Sync. El código del cliente en C# está disponible en https://github.com/mongodb/template-app-maui-todo.

Si usa este proceso para obtener el código del cliente, debe crear una aplicación de App Services para usarla con el cliente. Siga las instrucciones de "Crear una aplicación de sync.todo plantilla" para crear una aplicación de plantilla basada en la plantilla.

1

Navigate to the directory where the Realm CLI created the template app and open the realm-todo-app.sln solution in Visual Studio.

2

En Visual Studio, dedique unos minutos a explorar la organización de la solución. Está organizada como una solución MAUI MVVM estándar, con un único proyecto que contiene las vistas, los modelos y los modelos de vista.

La aplicación utiliza un único modelo, Item, que implementa IRealmObject. Tenemos tres vistas, una para iniciar sesión (LoginPage), otra para ver Items (ItemsPage) y una tercera para editar y crear nuevos items. Cada vista tiene un modelo de vista correspondiente.

Además de la estructura estándar MVVM, hemos centralizado toda la lógica de Realm en una clase RealmService, que se encuentra en la carpeta "Servicios". Esta arquitectura garantiza que estamos compartiendo el mismo realm en todo momento.

3

Sin realizar cambios en el código, debería poder ejecutar la aplicación en el emulador de Android, el simulador de iOS o en un dispositivo físico. No necesita realizar cambios, ya que, al configurar la plantilla en la interfaz de usuario de App Services o con la CLI, Atlas App Services también configura un nuevo backend. Si descargó la aplicación de plantilla, deberá agregar el ID de su aplicación de App Services. Para ello, abra el archivo Services/RealmService.cs y agregue su ID en la línea private const string appId = "appId";.

Ejecute la aplicación, registre una nueva cuenta de usuario y luego agregue un nuevo elemento a Su lista de tareas.

4

Inicia sesión en Atlas App Services. En la pestaña Data Services, haz clic en Browse Collections. En la lista de bases de datos, busca y expande la base de datos todo y luego la colección Item. Debería ver el documento que creó en esta colección.

Ahora que ha confirmado que todo funciona correctamente, podemos realizar cambios. En este tutorial, hemos decidido añadir una propiedad "Prioridad" a cada elemento para poder filtrarlos por su prioridad. La propiedad Prioridad se asignará a una enumeración PriorityLevel para limitar los valores posibles.

Para ello siga estos pasos:

1
  1. In the RealmTodo project, expand the Models folder and open the Item class file.

  2. Add the following public property:

    [MapTo("priority")]
    public int? Priority { get; set; }

    Tenga en cuenta que hemos establecido esta propiedad como nula, lo que garantizará que los elementos existentes en nuestra base de datos (que no tienen una propiedad de Prioridad) seguirán estando disponibles.

2
  1. El modelo de vista EditItemViewModel se utiliza tanto para crear nuevos elementos como para modificar los existentes. Al crear o modificar un elemento, el usuario necesita que la interfaz de usuario (y el código) establezcan su prioridad.

  2. Agregue una ObservableProperty para contener la prioridad:

    [ObservableProperty]
    private int? priority;

    Nota

    Atributo [ObservableProperty]

    El [ObservableProperty] atributo es una característica proporcionada por el kit de herramientas MVVM para simplificar la vinculación de datos.

  3. El método ApplyQueryAttributes actúa como un constructor para este modelo de vista, comprobando si se pasa un elemento existente a esta vista para su edición. Aquí, capturamos los valores existentes para mostrarlos en la vista.

    Si estamos editando un elemento existente, queremos establecer la Prioridad del elemento existente: Priority = InitialItem.Priority;.

    Del mismo modo, si estamos creando un nuevo elemento, establezca la prioridad predeterminada en "Media": Priority = 2;.

    Cuando esté completo, este método debería verse así:

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
    if (query.Count > 0 && query["item"] != null) // we're editing an Item
    {
    InitialItem = query["item"] as Item;
    Summary = InitialItem.Summary;
    Priority = InitialItem.Priority;
    PageHeader = $"Modify Item {InitialItem.Id}";
    }
    else // we're creating a new item
    {
    Summary = "";
    Priority = 2;
    PageHeader = "Create a New Item";
    }
    }
  4. Finalmente, en el método SaveItem(), queremos persistir el valor de Prioridad. Dado que estamos creando o modificando un objeto gestionado, los cambios se envuelven en una llamada a realm.WriteAsync.

    Para el elemento existente, configura el InitialItem.Priority en el objeto existente y, para un elemento nuevo, configura la propiedad en la llamada Add(). Su bloque WriteAsync completado debería verse así:

    await realm.WriteAsync(() =>
    {
    if (InitialItem != null) // editing an item
    {
    InitialItem.Summary = Summary;
    InitialItem.Priority = Priority;
    }
    else // creating a new item
    {
    realm.Add(new Item()
    {
    OwnerId = RealmService.CurrentUser.Id,
    Summary = summary,
    Priority = Priority
    });
    }
    });
3
  1. La tarea final consiste en agregar los elementos de la interfaz de usuario necesarios para establecer y mostrar la prioridad.

    Primero, en ItemsPage.xaml, agregaremos una etiqueta a ListView que muestra la prioridad. Dentro de ViewCell, agreguemos una etiqueta para mostrar la prioridad del elemento:

    <Label Text="{Binding Priority}"
    HorizontalOptions="Center"
    VerticalOptions="Center"/>
  2. In the EditItemsPage.xaml, we will add two UI elements: a Picker that enables the user to choose which priority level to set on the new Item and a label for the picker. Find the Entry element for setting the Summary and add the following elements below it:

    <Label Text="Priority:"/>
    <Picker x:Name="newItemPriority" SelectedIndex="{Binding Priority}">
    <Picker.Items>
    <x:String>Severe</x:String>
    <x:String>High</x:String>
    <x:String>Medium</x:String>
    <x:String>Low</x:String>
    </Picker.Items>
    </Picker>
4

En este punto, puede volver a ejecutar la aplicación. Inicie sesión con la cuenta que creó anteriormente en este tutorial. Verá el elemento que creó anteriormente. Añada un nuevo elemento y verá que ahora puede establecer la prioridad. Seleccione High como prioridad y guarde el elemento.

Ahora vuelve a la página de datos de Atlas en tu navegador y actualiza la colección Item. Ahora deberías ver el nuevo ítem con el campo priority añadido y configurado en 1. También notarás que el Item existente ahora también tiene un campo priority, y está configurado en null, como se muestra en la siguiente captura de pantalla:

Dos artículos en una colección
haga clic para ampliar

Nota

¿Por qué no se rompió esta sincronizar?

Adding a property to a Realm object is not a breaking change and therefore does not require a client reset. The template app has Development Mode enabled, so changes to the client Realm object are reflected in the server-side schema. For more information, see Development Mode and Update Your Data Model.

1

En el archivo RealmService.cs, definimos dos suscripciones de Flexible Sync. Una muestra solo los elementos creados por el usuario actual, mientras que la otra muestra todos los elementos de todos los usuarios.

We're going to add a new subscription that shows the current user's items that have a priority of 0 or 1.

  1. Al final de la clase RealmService, agregue una entrada al enum SubscriptionType llamada "MyHighPriority":

    public enum SubscriptionType
    {
    Mine,
    MyHighPriority,
    All,
    }
  2. Desplácese hacia arriba para encontrar el método GetQueryForSubscriptionType. Aquí definimos las suscripciones.

    1. Copie el primero, donde subType == SubscriptionType.Mine, y péguelo en un bloque else if inmediatamente debajo.

    2. Establezca la nueva condición en subType == SubscriptionType.MyHighPriority.

    3. Modifique esta nueva consulta de suscripción para insertar una consulta LINQ que aún filtre por OwnerId y también por valores de prioridad menores a 2.

    4. Change the name of the new query to "myHighPri". Your code will look like the following:

    if (subType == SubscriptionType.Mine)
    {
    query = realm.All<Item>()
    .Where(i => i.OwnerId == CurrentUser.Id)
    .Where(i => i.Priority < 2);
    queryName = "mine";
    }
    else if (subType == SubscriptionType.MyHighPriority)
    {
    query = realm.All<Item>()
    .Where(i => i.OwnerId == CurrentUser.Id &&
    i.Priority < 2);
    queryName = "myHighPri";
    }
    else if (subType == SubscriptionType.All)
    {
    query = realm.All<Item>();
    queryName = "all";
    }
  3. En el método GetCurrentSubscriptionType inmediatamente anterior, agregue el nuevo nombre de suscripción a la declaración switch, para que se vea así:

    return activeSubscription.Name switch
    {
    "all" => SubscriptionType.All,
    "mine" => SubscriptionType.Mine,
    "myHighPri" => SubscriptionType.MyHighPriority,
    _ => throw new InvalidOperationException("Unknown subscription type")
    };
  4. Finalmente, abra la clase ItemsViewModel y busque el método OnIsShowAllTasksChanged. En lugar de cambiar la interfaz de usuario para habilitar tres suscripciones, simplemente reemplazaremos la suscripción "mine" existente por la nueva. Modifique el método SetSubscription para que se vea como sigue:

    await RealmService.SetSubscription(realm, value
    ? SubscriptionType.All
    : SubscriptionType.MyHighPriority);
2

Vuelve a ejecutar la aplicación. Si se le solicita, inicie sesión usando la cuenta que creó anteriormente en este tutorial.

Verá todos los elementos que haya creado con prioridad "Alta" (1) o "Severa" (0). Si activa la opción "Mostrar todas las tareas", aparecerán todas las tareas de todos los usuarios.

Tip

Cambiar suscripciones con el modo de desarrollador habilitado

In this tutorial, when you change the subscription and query on the priority field for the first time, the field is automatically added to the Device Sync Collection Queryable Fields. This occurs because the template app has Development Mode enabled by default. If Development Mode was not enabled, you would have to manually add the field as a queryable field to use it in a client-side Sync query.

Para obtener más información, consulte Campos consultables.

Agregar una propiedad a un objeto Realm existente es un cambio no disruptivo, y el modo de desarrollo asegura que el cambio de esquema se refleje en el servidor.

Nota

Share Feedback

¿Cómo te fue? Usa el Rate this page widget en la parte inferior derecha de la página para evaluar su efectividad. O reporta un problema en el repositorio de GitHub si tuviste algún problema.

Next

¿Qué son los servicios de aplicación Atlas?