【问题标题】:How to use automapper with complex types如何使用具有复杂类型的自动映射器
【发布时间】:2014-04-10 17:31:34
【问题描述】:

在我的视图域模型中,我有以下对象用作我的属性的支持字段

public class ModelProperty<T>// where t:struct
{
    public T Value { get; set; }
    public string Description { get;  set; }
    public string LabelName { get;  set; }
}

对象依次呈现为:

    public partial class Incident : BaseEntityModel
    {
        private ModelProperty<string> typeCode = new ModelProperty<string>{Description="1-C", LabelName =  "Type Code"};
        private ModelProperty<string> typeText = new ModelProperty<string>{Description="1-C", LabelName =  "Type Text"};

        public ModelProperty<string> TypeCode { get {return typeCode;}}
        public ModelProperty<string> TypeText { get {return typeText;}}
    }

业务对象(我的来源)没有那么复杂。

public partial class Incident : ObjectBase
{
    public string TypeCode { get; set; }
    public string TypeText { get; set; }
}

是否可以将值从源映射到目标。使用 Automapper 我有以下映射设置

//note SrcObj is not an object but a namespace alias since the domain and business objects are of the same name
Mapper.CreateMap<SrcObj.Incident, Incident>()
                .ForMember(ui => ui.TypeText.Value,
                           opt => opt.MapFrom(src => src.TypeText));

但我得到了异常表达式必须解析为顶级成员而不是任何子对象的属性。在子类型或 AfterMap 选项上使用自定义解析器。

我是 automapper 的新手,但是在查看文档时,我正在使用的对象太复杂(基于这里确实有三种类型而不是两种类型的想法)?

如果可以处理这种类型的映射,这是如何完成的?

更新

根据 Jimmy 的建议,我将代码更新如下:

Mapper.CreateMap<SrcObj.Incident, Incident>();
Mapper.CreateMap<string, ModelProperty<string>>()
                .ConvertUsing(src => new ModelProperty<string> { Value = src });

Mapper.AssertConfigurationIsValid();     
SrcObj.Incident viewModelDto = md.GenerateMockIncident(); //populate the business object with mock data    
uibase = Mapper.Map<SrcObj.Incident, Incident>(viewModelDto);

代码执行,我没有得到任何异常,但是在业务对象中设置和返回的值仍未分配给支持属性Value,它仍然为空。

我错过了什么?

-干杯

【问题讨论】:

  • 我终于发现了未分配值的问题所在。我在域模型中创建的属性只定义了 get 和 return,但没有 setter。我向属性添加了一个私有设置器,现在正在应用映射

标签: c# automapper


【解决方案1】:

更简单的方法是创建类型转换器:

Mapper.CreateMap<string, ModelProperty<string>>()
    .ConvertUsing(src => new ModelProperty<string> { Value = src });

那么每次 AutoMapper 看到 string -> ModelProperty 时你都会得到这个。您根本不需要进行特定于成员的配置。

【讨论】:

  • 我已经更新了我的问题。我尝试了类型转换器,该方法毫无例外地执行,但没有从业务对象模型中的值向域中的模型分配任何值。有关如何解决此问题或确定其未分配原因的任何建议?
【解决方案2】:

试试这个..你需要给一个ModelProperty对象映射到目标TypeText

Mapper.CreateMap<Funky.Incident, Incident>()
       .ForMember(ui => ui.TypeText,
                  opt => opt.MapFrom(src => 
                         new ModelProperty<string> 
                         { 
                          Value = src.TypeText 
                         }));

对 TypeCode 属性映射执行相同操作,以便映射所有字段。

您需要考虑每个成员映射,仅当它们的名称不同或它们的类型名称不同时。在这种情况下,AutoMapper 将很难将字符串转换为 Model 对象,直到您给出提示。

也尝试映射TypeCode.. 而且我不知道 ObjectBase 等的属性。所以你需要检查那里是否还需要任何手动映射。

【讨论】:

  • 纠正了最初的异常,但我仍然没有看到映射到新对象的数据。看来其他地方还有问题
  • 上述映射是否通过? AutoMapper.AssertConfigurationIsValid()
  • 是的,我现在看到了异常它通知我发现了其他未映射的成员。我不知道我需要考虑每个成员,我假设每个定义的映射都将适用,如果发现其他成员,它们将被忽略。我是否假设如果找到其他映射,它不会映射对象?
  • 您需要考虑每个成员,前提是他们的名称不同或类型名称不同。在这种情况下,AutoMapper 将很难将字符串转换为 Model 对象,直到您给出提示。您是否也尝试过映射 TypeCode.. 而且我不知道 ObjectBase 等的属性。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
相关资源
最近更新 更多