2013-02-11 1 views
4

Мы надеемся перейти к использованию Dapper, чтобы обеспечить сопоставление объектных отношений с нашими бизнес-моделями.Использование Dapper для привязки с сильно типизированной моделью с дополнительными динамическими свойствами

Наряду с этими моделями данных, мы часто сталкиваемся с пользовательскими полей (не известно во время выполнения), которые создаются пользователями и появляются как часть возвращаемого набора результатов:

Id 
Title 
c_MyCustomField1 
c_MyCustomField2 

В настоящее время все эти поля возвращаются и обрабатывается с помощью считывателя. Нам нравится перемещать все это до Dapper, но изо всех сил пытается понять, как смешивать сильно типизированный объект, смешанный с динамическими настраиваемыми полями.

Мы видим, наши варианты, как это:

  1. Получить каждый результат от щеголеватого, как динамичные и сделать наши собственные привязки.
  2. Получить Dapper для привязки к строго типизированной модели и сделать отдельный вызов для добавления настраиваемых полей.
  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;} 
} 

Есть ли способ, это может быть сделано с помощью щеголеватый?

Как всегда, любые предложения были высоко оценены.

ответ

3

Это не может быть смоделировано чисто в dapper в настоящее время; вы можете что-то сделать с помощью не общего API, а затем вручную применить привязки. Или, может быть, просто обернуть динамику:

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 без указания общего параметра.

+0

Как ни странно, «чистое» было прилагательным, которое пришло в голову при обсуждении этого. Ваше предложение определенно похоже, что это должно быть так, как мы голова, если мы решим совершить прыжок. Спасибо за ваше время. –

+0

У нас есть лучший способ привязать сейчас в последней версии Dapper? –

+0

@CoderAbsolute не в настоящее время, нет –