Code Snippets Entity Framework Core para Xamarin Forms
Tags: xamarin, efcore, dotnet, mobile
Published: 2020-06-29 14:18:02

Este Post forma parte del **Xamarin Month 2020** una iniciativa de Luis Matos, con un enfoque en Code Snippets útiles en el desarrollo de aplicaciones móviles con Xamarin Forms y Visual Studio ya sea para Windows o Mac. Puedes revisar el resto de contribuciones realizadas por increíbles autores, profesionales y miembros de la comunidad de Xamarin en el siguiente enlace => [XamarinMonth](https://luismts.com/code-snippetss-xamarin-month/).

**Entity Framework Core** es el ORM favorito de muchos desarrolladores de software .NET, personalmente me parece genial y lo utilizo muy a menudo, es por eso que quiero compartir con contigo algunos Code Snippets que te podrían ser útiles. Cuando de utilizar Entity Framework Core se trata siempre estamos obligados a escribir un Contexto de Datos que se encargará de gestionar la conexión a la Base de datos, además de utilizar el Dependency Service de Xamarin Forms para implementar funcionalidades especificas de cada plataforma.

Los Code Snippets que crearemos en este Post serán:
- Contexto de Datos *AppDbContext.cs*
- Interface de Configuración para obtener el Directorio de BD de cada plataforma *IConfigDataBase.cs* 
- Implementaciones especificas de Android y iOS *ConfigDataBase.cs* 

# Creando el primer Code Snippet
Para crear Code Snippets para Visual Studio en Windows lo que necesitamos es crear un archivo .xml, llenar los elementos correspondientes y agregar el código.
La Documentación oficial de Microsoft nos proporciona un archivo .xml que contiene la plantilla básica para crear nuestro primer fragmento de código.
```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title></Title>
        </Header>
        <Snippet>
            <Code Language="">
                <![CDATA[]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```

## Code Snippet AppDbContext.cs
Crearemos un archivo llamado *DbContext.snippet* en la siguiente ruta **%USERPROFILE%\Documents\Visual Studio 2019\Code Snippets\Visual C#\My Code Snippets**, con base en la plantilla anterior llenaremos los elementos y agregaremos el código.
```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>DbContext</Title>
            <Author>Eduardo Barrios</Author>
            <Description>Crea un Contexto de Datos Entity Framework Core para Xamarin Forms.</Description>
            <Shortcut>dbcontext</Shortcut>
        </Header>
        <Snippet>
            <Code Language="CSharp">
                <![CDATA[
                public class AppDbContext : DbContext
                {
                    string DbPath = string.Empty;

                    public AppDbContext(string dbPath)
                    {
                        this.DbPath = dbPath;
                    }     

                    // TODO: Declarar los objetos del modelo

                    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
                    {
                        optionsBuilder.UseSqlite("Filename="+DbPath);
                    }
                }
                ]]>
            </Code>            
          <Imports>
            <Import>
              <Namespace>Microsoft.EntityFrameworkCore</Namespace>
            </Import>
          </Imports>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```

## Probando Code Snippet AppDbContext
Para probar este code snippet debemos crear una nueva clase llamada AppDbContext para que coincida con el nombre de la clase que creará el code snippet, puedes nombrar de otra manera la clase del contexto y cambiarla en el código del fragmento como te guste.
Borramos los using, la clase completa y solo dejaremos el namespace.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/qjlm098u3z5if5ar8jki.PNG)

Escribimos el shorcut dbcontext, dbcontext hace referencia al tag shorcut que definimos en el archivo .xml, podemos notar que el intellisense de Visual Studio  nos muestra información del Code Snippet que fue definida en el mismo archivo *DbContext.snippet*
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/e03a9vqxlgi36x1levar.png)

Presionamos la tecla TAB dos veces y veremos como el code snippet funciona correctamente y crea el código predefinido.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/4mcz1rpvgpj5hiwt3rvx.PNG)
- - -

# Interface de Configuración IConfigDataBase
Repetimos los pasos anteriores para crear el code snippet que nos permitirá crear una interface en el proyecto .NET Standard para su posterior implementación en cada plataforma.
```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Xamarin-IConfigDataBase</Title>
            <Author>Eduardo Barrios</Author>
            <Description>Crea una Interface para Configuración de Base de Datos SQLite (Dependency Service).</Description>
            <Shortcut>iconfiguration</Shortcut>
        </Header>
        <Snippet>
            <Code Language="CSharp">
                <![CDATA[
                public interface IConfigDataBase
                {
                    string GetFullPath(string databaseFileName);
                }
                ]]>
            </Code>                      
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```
Crearemos una nueva Interface que por convención se llamará IConfigDataBase.cs, seguidamente escribimos el shorcut *iconfiguration* que definimos previamente en el code snippet.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/26e08t5x383wdeh03iih.png)

Presionamos dos veces la tecla TAB y verificamos que nuestro code snippet funciona correctamente.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/k8v4mc5lu1lgorvipor4.PNG)
* * *

# Code Snippets implementaciones Android y iOS
En los siguientes fragmentos de código agregaremos el código correspondiente para el método GetFullPath(string databaseFileName) y no para la clase completa debido a que debemos implementar la interface creada en el proyecto .NET Standard y el nombre puede ser arbitrario según sea tu decisión y su namespace puede variar.

### Android
Repetimos el proceso anterior, creamos el archivo con extensión .snippet y lo nombraremos GetFullPathAndroid.snippet, lo guardamos en la ruta correspondiente.
```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Xamarin-ConfigDataBase</Title>
            <Author>Eduardo Barrios</Author>
            <Description>Crea el método GetFullPath para obtener la ruta de BD en Android (Dependency Service).</Description>
            <Shortcut>getfullpathandroid</Shortcut>
        </Header>
        <Snippet>
            <Code Language="CSharp">
                <![CDATA[                
                public string GetFullPath(string databaseFileName)
                {
                    return Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), databaseFileName);
                }                        
                ]]>
            </Code> 
            <Imports>
                <Import>              
                  <Namespace>System.IO</Namespace>
                </Import>
            </Imports>                     
        </Snippet>        
    </CodeSnippet>
</CodeSnippets>
```
Posterior a guardar el archivo .snippet podremos comprobar que el intellisense de VS nos muestra la opción y la información de nuestro code snippet.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gx0uwjyz1t2qpkz7x94d.png)

Presionamos la tecla TAB dos veces para comprobar el correcto funcionamiento de nuestro code snippet.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/w737mgc0pqfkmw6jlx39.PNG)
***

### iOS
Repetimos el proceso anterior, en este caso llamaremos GetFullPathIOS.snippet a nuestro archivo .snippet y lo guardamos en la ruta correspondiente.
```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Xamarin-ConfigDataBase</Title>
            <Author>Eduardo Barrios</Author>
            <Description>Crea el método GetFullPath para obtener la ruta de BD en iOS (Dependency Service).</Description>
            <Shortcut>getfullpathios</Shortcut>
        </Header>
        <Snippet>
            <Code Language="CSharp">
                <![CDATA[                
                public string GetFullPath(string databaseFileName)
                {
                    return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library", databaseFileName);
                }                        
                ]]>
            </Code> 
            <Imports>
                <Import>              
                  <Namespace>System.IO</Namespace>
                </Import>
            </Imports>                     
        </Snippet>        
    </CodeSnippet>
</CodeSnippets>
```
Ya podemos utilizar el code snippet.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/osa61uqt4c61qkekfeul.png)

Presionamos la tecla TAB dos veces para comprobar el correcto funcionamiento de este code snippet.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fjxmklm8k8ybbftr4wl9.PNG)
* * *

> **Nota:** No olvidar implementar la interface creada en el proyecto .NET Standard y exportar el assembly **[assembly: Dependency(typeof(ConfigDataBase))]** sobre la línea del namespace de cada implementación, puedes crear un code snippet para esto si lo requieres aunque yo lo considero innecesario. 

## Conclusión
Los Code Snippet son útiles para ser más productivos ya que nos permiten encapsular bloques de código que usamos muy a menudo y reutilizarlo mediante un comando de menú contextual o una combinación de teclas de acceso rápido. 

Puedes crear Code Snippet para Visual Studio for Mac en el siguiente link:
https://docs.microsoft.com/en-us/visualstudio/mac/snippets?view=vsmac-2019

Para Windows utiliza el siguiente link:
https://docs.microsoft.com/es-es/visualstudio/ide/walkthrough-creating-a-code-snippet?view=vs-2019

**En el siguiente Link encontrarás los archivos creados en este post**

{% github EbarriosCode/CodeSnippetsEFCoreXamarinForms %}