0

我使用 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; }
}

在这种情况下,它们的模型和视图模型都为ComplexType引用了同一个文件,因此它们不会有所不同。

4

1 回答 1

0

从 ViewModel 映射到 Domain Model 时是否使用了 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));
}
于 2013-06-22T15:35:50.553 回答