我正在尝试使用 AutoMapper 将从 Web 服务接收到的一些 DTO(数据契约)对象映射到我的业务对象中。根 DTO 对象包含子对象的集合。我的业务对象还有一个子业务对象的子集合。为了让 AutoMapper 工作,我必须在业务对象中的集合属性上包含一个 setter,否则集合将始终为空。此外,我必须向集合类型添加默认构造函数。因此,在我看来,AutoMapper 正在实例化一个新的集合对象,填充它并设置为我的业务对象的集合属性。
虽然这一切都很好,但在创建集合时必须连接额外的逻辑,并且使用默认构造函数无法达到目的。本质上,我正在建立父子关系并连接一些事件,以便它们从子项传递到父项。
我想做的是让 AutoMapper 简单地将 DTO 集合中的子对象映射到我的 BO 上的现有集合。换句话说,跳过创建新集合的过程,而只需使用业务对象已有的集合。
有什么办法可以轻松实现这一点吗?!?!?
UPDATE
也许一个更好的问题和更简单的解决方案是,是否可以定义 AutoMapper 在实例化时传递给集合的参数?我的子集合定义如下:
public class ChildCollection : Collection<ChildObjects>
{
public ChildCollection(ParentObject parent) { Parent = parent; }
}
如果我可以配置 AutoMapper 使用此构造函数并传入正确的对象,那就完美了!
另一个更新
为了清楚起见,以下是问题空间中的其他类:
public class ParentObject
{
private ChildCollection _children;
public ChildCollection Children
{
get
{
if (_children == null) _children = new ChildCollection(this);
return _children;
}
}
}
public class ParentDTO
{
public ICollection<ChildDTO> Children { get; set; }
}
public class ChildDTO
{
public String SomeProperty { get; set; }
}
我这样配置 AutoMapper:
Mapper.CreateMap<ParentDTO, ParentObject>();
Mapper.CreateMap<ChildDTO, ChildObject>();
通过这种方式,我必须向 ParentObject 中的 Children 属性添加一个 setter,并向 ChildCollection 添加一个默认(无参数)构造函数。虽然我可以解决定义父子关系的需要,但期望 AutoMapper 支持在创建子集合时配置映射以使用特定构造函数似乎是合乎逻辑的。像这样的东西:
Mapper.CreateMap<ParentDTO, ParentObject>()
.ForMember(obj => obj.Children, opt.MapFrom(dto => dto.Children))
.ConstructUsing(col => new ChildCollection(obj));
请注意,我传递了对“object”的引用,它是正在映射的父对象实例。