> For the complete documentation index, see [llms.txt](https://elguerre.gitbook.io/de0an/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://elguerre.gitbook.io/de0an/capitulo-7-la-construccion.-accediendo-a-los-datos/servicios-de-acceso.md).

# Servicios de Acceso

El acceso a los repositorios de datos lo hacemos a través de los proveedores. Aun siendo esto suficiente en la mayoría de las circunstancias, los servicios de acceso a datos, actúan de intermediarios entre los *ViewModels* y los proveedores de manera que adecúan los parámetros y los datos para que el proveedor los procese. Al mismo tiempo, llevan a cabo la gestión de errores y trazas, así como otra mucha lógica que permite el aislamiento entre el *ViewModel* y el proveedor de acceso a datos y evite posibles peculiaridades de este último. Por ejemplo, el servicio “SQLiteDataService” dispone de un método general “**ExceptionManager**” que se encarga de procesar todas las respuestas gestionando sus excepciones y escritura de trazas.

```csharp
public class SQLiteDataService : IDataService
{
    private IDataProvider provider;
    private ITrace tracer;
    public SQLiteDataService(IDataProvider provider, ITrace tracer)
    {
        this.provider = provider;
        this.tracer = tracer;
    }
    private Task<TResult> ExceptionManager<TResult>(Func<Task<TResult>> action, [CallerMemberName] string callerName = "")
    {
        try
        {
            return action.Invoke();
        }
        catch (Exception ex)
        {
            this.tracer.TraceError(callerName, ex);
            throw ex;
        }
    }
```

Las excepciones son tratadas de manera que éstas queden reflejadas en un fichero de log. Para ello se utiliza la interfaz “ITrace” y su implementación “TraceManger” que quedan registradas en el contenedor de dependencias, en la clase “ViewModelLocator”, como sigue:

```csharp
#if DEBUG
SimpleIoc.Default.Register<ITrace>(() => { return new TraceManager(MessageType.Information); });
#else
SimpleIoc.Default.Register<ITrace>(() => { return new TraceManager(MessageType.Error); });
#endif
```

Tanto la interfaz como su implementación forman parte del proyecto “InTools” y su código consta básicamente de la escritura de mensajes en ficheros, haciendo uso a su vez de la clase “StorageHelper”, que ya comentamos al comienzo de este capítulo.

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-48dc58a7211fe34f8cef3cdcc7d8353a3d551bf0%2Fimage12.PNG?alt=media)

**Figura 12.- Interfaz ITrace y clase TraceManager para la gestión de trazas**

Veremos más sobre el tratamiento de trazas, en este mismo capítulo, en la sección “Tratamiento de errores y trazas”.
