使用Dapper与具有其他动态属性的强类型模型绑定

时间:2013-02-11 12:19:51

标签: c# dynamic dapper strong-typing

我们希望转而使用Dapper为我们的商业模式提供对象关系映射。

与这些数据模型一起,我们经常遇到由用户创建并显示为返回结果集的一部分的自定义字段(在运行时未知):

Id
Title
c_MyCustomField1
c_MyCustomField2

目前,所有这些字段都是由读者返回和处理的。我们希望将所有这些转移到Dapper,但很难找到如何混合强类型对象与动态自定义字段混合。

我们看到这样的选项:

  1. 将dapper的每个结果都视为动态,并自行绑定。
  2. 获取Dapper绑定到强类型模型并单独调用以附加自定义字段。
  3. 扩展Dapper以进入中间添加我们的特定用户案例以绑定已知和动态字段。
  4. 1 似乎适得其反,我们可能会受到性能影响,这就是为什么你首先要介绍Dapper的原因。 2 我们实在无法做到,因为这需要对数据提供商进行大规模更改。 3 我知道我不属于Dapper的来源。

    我认为圣杯会以这样的模型结束:

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

    有没有办法可以用Dapper来完成?

    一如既往,非常感谢任何建议。

1 个答案:

答案 0 :(得分:3)

目前在短小精悍的时候无法完全建模;您可能能够使用非泛型API执行某些操作,然后手动应用绑定。或者只是 wrap 动态:

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

您可以使用dynamic获取IDictionary<string,object> / Query,而无需指定通用参数。