我使用Automapper将我的域模型映射到我的viewModel,这非常有用。 Atm我只是原型设计和改变模型很多,所以此时我的viewModel几乎是我的模型的精确副本,我的viewModel从域中引用其复杂类型的类(所以我只需保留根类我的viewModel与我的域模型同步。)
尽管从域模型到viewModel的映射效果很好,但将viewModel映射回域模型并不能很好地工作。直接在viewModel中的值会映射,但复杂类型的列不会映射。我该如何解决这个问题?
这是我模型的简单表示:
public class model
{
public int someValue { get; set; }
public virtual ICollection<ComplexType> aList { get; set; }
}
public class viewModel
{
public int someValue { get; set; }
public virtual ICollection<ComplexType> aList { get; set; }
}
public class ComplexType
{
public int someOtherValue { get; set; }
}
在这种情况下,模型和viewModel都引用 ComplexType 的相同文件,因此这些文件不能有所不同。
答案 0 :(得分:0)
从ViewModel映射到域模型时,您是否使用了ReverseMap?
public class CustomProfile : Profile
{
protected override void Configure()
{
// Mapper.CreateMap<Model, ViewModel>();
// Mapper.CreateMap<ViewModel, Model>();
Mapper.CreateMap<Model, ViewModel>().ReverseMap();
}
}
这非常合理,并且可以毫无问题地映射所有内容。
[TestInitialize]
public void Initialize()
{
Mapper.Initialize(conf => conf.AddProfile(new CustomProfile()));
}
[TestMethod]
public void AssertConfiguration()
{
Mapper.AssertConfigurationIsValid();
}
[TestMethod]
public void Test()
{
var model = new Model()
{
ComplexTypes = new Collection<ComplexType>() { new ComplexType() { SomeOtherValue = 1 }, new ComplexType() { SomeOtherValue = 4 } },
SomeValue = 3
};
var viewModel = Mapper.Map<ViewModel>(model);
Assert.AreEqual(model.SomeValue, viewModel.SomeValue);
Assert.AreEqual(model.ComplexTypes.Count, viewModel.ComplexTypes.Count);
Assert.AreEqual(model.ComplexTypes.ElementAt(0), viewModel.ComplexTypes.ElementAt(0));
Assert.AreEqual(model.ComplexTypes.ElementAt(1), viewModel.ComplexTypes.ElementAt(1));
model = Mapper.Map<Model>(viewModel);
Assert.AreEqual(viewModel.SomeValue, model.SomeValue);
Assert.AreEqual(viewModel.ComplexTypes.Count, model.ComplexTypes.Count);
Assert.AreEqual(viewModel.ComplexTypes.ElementAt(0), model.ComplexTypes.ElementAt(0));
Assert.AreEqual(viewModel.ComplexTypes.ElementAt(1), model.ComplexTypes.ElementAt(1));
}