【发布时间】:2015-03-25 14:05:00
【问题描述】:
我有一些相当简单的代码可以将用户对视图模型中集合的更改应用到模型中的集合。
public void Apply(ViewModelListItem source, ICollection<ModelListItem> dest)
{
//user added and removed an item before saving, do nothing
if (source.Insert && source.Delete) return;
//user added an item
if (source.Insert)
{
dest.Add(Mapper.Map<T>(source));
}
//user deleted an item
else if (source.Delete)
{
//Using custom Equals implementation that compares PK
dest.Remove(dest.FirstOrDefault(destItem => source.Equals(destItem)));
}
//user modified or did not alter an item
else
{
//Using custom Equals implementation that compares PK
Mapper.Map(source, dest.FirstOrDefault(destItem => source.Equals(destItem)));
}
}
...
foreach (var item in MyViewModel.MyCollection)
{
Apply(item, MyModel.MyCollection);
}
我在代码中的多个位置使用了这种模式,因此我一直在寻找一种以通用方式重用代码的方法。 Automapper 是否有办法简单地将引用传递给源/目标并让我在其上运行我自己的设置逻辑?如果没有,有没有其他方法可以使这段代码通用,这样我就不必为每个新的视图模型编写它?
【问题讨论】:
-
您找到答案了吗?我也有同样的问题。
-
添加了我的解决方案作为答案。注意:由于其他原因,我最终放弃了 automapper,但仍然使用相同的想法来映射集合,只是减去了 automapper 集成。
标签: c# generics mapping viewmodel automapper