Utilisation de Dapper pour lier avec un modèle fortement typé avec des propriétés dynamiques supplémentaires

c# dapper dynamic strong-typing

Question

Nous espérons pouvoir utiliser Dapper pour fournir le mappage de relation d'objet à nos modèles commerciaux.

Outre ces modèles de données, nous rencontrons souvent des champs personnalisés (inconnus à l'exécution) créés par les utilisateurs et apparaissant dans le jeu de résultats renvoyé:

Id
Title
c_MyCustomField1
c_MyCustomField2

Actuellement, tous ces champs sont renvoyés et traités avec un lecteur. Nous aimons passer tout cela à Dapper, mais nous avons du mal à trouver comment mixer l'objet fortement typé avec des champs personnalisés dynamiques.

Nous voyons nos options comme ceci:

  1. Obtenez tous les résultats de dapper comme dynamiques et effectuez nos propres liaisons.
  2. Demandez à Dapper de se lier au modèle fortement typé et effectuez un appel séparé pour attacher les champs personnalisés.
  3. Étendez Dapper pour obtenir au milieu notre cas utilisateur spécifique pour lier les champs connus et dynamiques.

1 semble contre-productif et nous allons peut-être prendre un succès, ce qui explique pourquoi vous présentez Dapper en premier lieu. 2 nous ne pouvons vraiment pas faire car cela nécessiterait un changement massif au fournisseur de données. 3 Je sais que je n'appartiens pas à la source de Dapper.

Je pense que le Saint Graal finirait avec un modèle comme celui-ci:

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;}
}

Y a-t-il un moyen d'utiliser Dapper?

Comme toujours, toutes les suggestions sont grandement appréciées.

Réponse acceptée

Cela ne peut pas être modélisé proprement dans dapper actuellement; Vous pourrez peut-être faire quelque chose avec l'API non générique, puis appliquer manuellement les liaisons. Ou peut-être juste envelopper une dynamique:

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; }
    }
}

Vous pouvez obtenir un IDictionary<string,object> dynamic / IDictionary<string,object> en utilisant Query sans spécifier de paramètre générique.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi