Как я могу использовать autopper для условного отображения ключа / значений в DTO? - PullRequest
1 голос
/ 10 декабря 2010

У меня есть следующий сценарий:

Из-за неудачной устаревшей базы данных у меня есть некоторые классы, сопоставленные с NHibernate, которые я хочу объединить в DTO. Это выглядит примерно так:

Вот что я в конечном итоге хочу:

public class ProteinSampleDto
    {
        public virtual SampleType SampleType { get; set; }
        public virtual Project Project { get; set; }
        public virtual long Variant { get; set; }
        public virtual DateTime CreationDate { get; set; }
        public virtual User User { get; set; }

        public virtual string PrepNumber { get; set; }
        public virtual string Host { get; set; }
        public virtual string NTermTag { get; set; }
        public virtual string CTermTag { get; set; }
        public virtual string Buffer { get; set; }
        public virtual double ConcentrationMgPerMl { get; set; }
        public virtual double StorageTemperatureCelsius { get; set; }
        public virtual string PurificationProtocol { get; set; }
        public virtual string Comments { get; set; }
        public virtual string ProteinSequence { get; set; }
    }

Вот то, что я имею после сопоставления базы данных:

public class ProteinSample : PersistentObject
    {

        public virtual SampleType SampleType { get; set; }
        public virtual Project Project { get; set; }
        public virtual long Variant { get; set; }
        public virtual DateTime CreationDate { get; set; }
        public virtual User User { get; set; }
        public virtual IList<SampleMetadata> Metadata { get; set; }

    }

public class SampleMetadata : PersistentObject
    {
        public virtual ProteinSample ProteinSample { get; set; }
        public virtual MetadataType MetadataType { get; set; }
        public virtual string Value { get; set; }
        public virtual string LargeValue { get; set; }
    }

 public class MetadataType : PersistentObject
    {
        public virtual string Name { get; set; }
    }

Если присмотреться, тип SampleMetadata имеет тип MetadataType и два значения (большое / обычное). MetadataType имеет имя, которое, по сути, представляет собой вопрос, который задают пользователю по поводу образца (что такое номер приготовления, что такое N-термическая аминокислота и т. Д.) ...

Я хочу условно посмотреть имя MetadataType следующим образом:

If Name contains: "Prep Number"
        populate the "PrepNumber" property on ProteinSampleDTO with SampleMetadata.Value
else if Name contains: "N-Term AA"
        populate the "NTermTag" property on ProteinSampleDTO with SampleMetadata.LargeValue
//etc

Вы поняли идею. Я хочу сопоставить то, что находится в MetdataType.Name, с именем свойства DTO и использовать значение из Value или Large Value в классе SampleMetadata.

Я могу изменить имена свойств, чтобы они более точно соответствовали строке «Имя», если соглашение облегчает эту задачу.

Похоже, что должен быть изящный способ сделать это без необходимости вручную создавать большой оператор переключения монстров (Есть около 50 различных вопросов).

Может ли автопроизводитель справиться с этим?

1 Ответ

2 голосов
/ 10 декабря 2010

Похоже, вам нужен пользовательский преобразователь или, возможно, специальный преобразователь типов:

http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers

http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters&referringTitle=Home

...