如何使用automapper有条件地将键/值映射到DTO?

时间:2010-12-09 21:29:47

标签: orm automapper dto

我有以下情况:

由于一个不幸的遗留数据库,我有一些映射到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-Term氨基酸是什么等等)

我想通过以下方式有条件地查看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属性名称进行匹配,并使用SampleMetadata类中的Value或Large Value中的值。

我可以更改属性的名称以更接近地匹配Name字符串,如果有约定有助于使这更容易。

似乎应该有一个光滑的方式来做到这一点,而不必手动制作一个大的怪物切换声明(有大约50个不同的问题)。

可以自动化处理吗?