Model Automapper在MVVM应用程序中的使用

Model Automapper在MVVM应用程序中的使用,model,automapper,mvvm,Model,Automapper,Mvvm,我正在构建一个MVVM应用程序。模型/实体(我正在使用NHibernate)已经完成,我正在考虑使用AutoMapper在ViewModel和model之间进行映射 然而,这一条款把我吓坏了:(来自) AutoMapper为每个类型映射(源/目标对)强制执行该操作, 目标类型上的所有属性都与匹配 关于源类型的一些问题 对我来说,合乎逻辑的选择是从一个模型映射到另一个viewmodel(我将让viewmodel手动指定给model),但引用基本上扼杀了这一想法,因为viewmodel肯定具有模型上

我正在构建一个MVVM应用程序。模型/实体(我正在使用NHibernate)已经完成,我正在考虑使用AutoMapper在ViewModel和model之间进行映射

然而,这一条款把我吓坏了:(来自)

AutoMapper为每个类型映射(源/目标对)强制执行该操作, 目标类型上的所有属性都与匹配 关于源类型的一些问题

对我来说,合乎逻辑的选择是从一个模型映射到另一个viewmodel(我将让viewmodel手动指定给model),但引用基本上扼杀了这一想法,因为viewmodel肯定具有模型上不存在的属性

您是如何在MVVM应用程序中使用Automapper的?请帮忙

当它说“映射”时,并不意味着它是1:1映射,它只是意味着需要考虑所有属性。要么Automapper可以根据约定找出它,要么显式地映射它们,要么显式地告诉它一个给定的属性

下面是文档中的示例。正如您所看到的,属性在某种意义上是被映射的,但Automapper知道忽略它

Mapper.CreateMap<Source, Destination>()
    .ForMember(dest => dest.SomeValuefff, opt => opt.Ignore());
Mapper.CreateMap()
.ForMember(dest=>dest.SomeValuefff,opt=>opt.Ignore());

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

我想知道是否有人尝试过这样做:

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); }
    }

有价值的被动扩展也会有所帮助

这很有帮助。这是否也适用于源属性?我希望能够将新属性添加到源,并且只添加到源,而不必担心破坏目标(viewmodel)。任何位于源上但不位于目标上的属性都将被自动忽略。我喜欢Automapper,但在MVVM场景中,“默认忽略”似乎更好。我认为团队会因为总是显式地忽略新属性而感到恼火。使用ValueInjector,您根本不必创建映射,只需创建映射算法(值注入),请参见此处,您不必担心存在于一侧而不存在于另一侧的属性