Usar Dapper para enlazar con un modelo fuertemente tipado con propiedades dinámicas adicionales

c# dapper dynamic strong-typing

Pregunta

Esperamos trasladarnos para utilizar Dapper para proporcionar el mapeo de relaciones de objeto a nuestros modelos de negocio.

Junto con estos modelos de datos, a menudo encontramos campos personalizados (no conocidos en tiempo de ejecución) creados por los usuarios y que aparecen como parte del conjunto de resultados devuelto:

Id
Title
c_MyCustomField1
c_MyCustomField2

Actualmente, todos estos campos se devuelven y manejan con un lector. Nos gusta pasar todo esto a Dapper, pero tenemos problemas para encontrar la forma de mezclar el objeto fuertemente tipado mezclado con campos personalizados dinámicos.

Vemos nuestras opciones así:

  1. Obtenga todos los resultados de dapper como dinámicos y haga nuestro propio enlace.
  2. Obtenga Dapper para enlazar al modelo fuertemente tipado y realice una llamada por separado para adjuntar los campos personalizados.
  3. Extienda Dapper para que se meta en el medio agregue nuestro caso de usuario específico para vincular tanto los campos conocidos como los dinámicos.

1 parece contraproducente y posiblemente tengamos un golpe de rendimiento por lo que deberías presentar a Dapper en primer lugar. 2 Realmente no podemos hacer, ya que esto requeriría un cambio masivo al proveedor de datos. 3 Sé que no pertenezco a la fuente de Dapper.

Creo que el Santo Grial terminaría con un modelo como este:

class Model
{
    int Id {get; set;}
    string Title {get; set;}
    IList<CustomField> CustomFields {get; set;}
}

class CustomField : dynamic
{
    string Name {get; set;}
    object Value {get; set;}
}

¿Hay alguna manera de que esto se pueda hacer usando Dapper?

Como siempre, cualquier sugerencia muy apreciada.

Respuesta aceptada

Eso no se puede modelar limpiamente en dapper actualmente; es posible que pueda hacer algo con la API no genérica y luego aplicar los enlaces manualmente. O tal vez solo envuelva una dinámica:

class Model {
    private dynamic obj;
    public int Id { get { return obj.Id; } set { obj.Id = value; } }
    public string Title { get { return obj.Title; } set { obj.Title = value; } }

    public object this[string key] {
        get { return ((IDictionary<string,object>)obj)[key]; }
        set { ((IDictionary<string,object>)obj)[key] = value; }
    }
}

Puede obtener un IDictionary<string,object> dynamic / IDictionary<string,object> utilizando Query sin especificar un parámetro genérico.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow