在MVVM应用程序中使用Automapper

3
我正在构建一个MVVM应用程序。模型/实体(我正在使用NHibernate)已经完成,我正在考虑使用AutoMapper在ViewModel和Model之间进行映射。
然而,这个条款让我感到非常害怕:(来自http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx
“对于每个类型映射(源/目标对),AutoMapper强制要求目标类型上的所有属性都与源类型上的某些属性匹配。”
对我来说,逻辑选择是从模型映射到视图模型(并且我会让视图模型手动分配给模型),但是引用基本上破坏了这个想法,因为视图模型肯定会有一些不存在于模型上的属性。
你如何在MVVM应用程序中使用AutoMapper?请帮忙!

使用ValueInjecter,您不需要创建任何映射,只需创建映射算法(值注入),请参见此处http://valueinjecter.codeplex.com/documentation,并且您不需要担心存在于一侧但不存在于另一侧的属性。 - Omu
3个回答

7
当说到“map”时,它并不意味着是一对一的映射,只是意味着需要考虑所有属性。您可以通过以下方式之一实现自动映射:从约定中让Automapper自动完成、显式地进行映射,或显式告诉它 忽略 给定的属性。
这是文档中的示例。如您所见,该属性被映射到了某种程度上,但Automapper知道应该忽略它。
Mapper.CreateMap<Source, Destination>()
    .ForMember(dest => dest.SomeValuefff, opt => opt.Ignore());

有帮助。这个方法也适用于源属性吗?我想要能够向源添加新属性,而且只针对源进行修改,而不必担心会影响目标(视图模型)。 - Echiban
任何在源对象上存在但在目标对象上不存在的属性都会被自动忽略。 - Roman
我喜欢Automapper,但在MVVM场景中,“默认忽略”似乎更好。我认为团队会因为总是需要显式地忽略新属性而感到烦恼。 - Mike Cole

0

我想知道有没有人尝试过像这样的东西:

public bool SetMappedProperty<TC,TV>(ref TC cont, TV value, [CallerMemberName] string propertyName = null)
    {
        var prop = cont.GetType().GetProperty(propertyName);
        var old = prop.GetValue(cont, null);

        if (Equals(old, value)) { return false; }

        prop.SetValue(cont, value);

        RaisePropertyChanged(propertyName);
        return true;
    }

然后像这样使用:

public override MyType MyProperty
    {
        get { return _myData.MyProperty; }
        set { SetMappedProperty( ref _myData, value); }
    }

响应式扩展 WhenAnyValue - 也可以帮助处理这些事情。


0
你可以考虑使用Polymod。Polymod代理本质上是包装你的nhibernate对象的视图模型。通过它的公式功能,你可以添加自更新属性,例如IsComboVisible = (domainobject.A + domainobject.B > 10)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接