Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当你有丰富的模型时,你会做什么?_C#_Design Patterns_Mvvm_Viewmodel_Models - Fatal编程技术网

C# 当你有丰富的模型时,你会做什么?

C# 当你有丰富的模型时,你会做什么?,c#,design-patterns,mvvm,viewmodel,models,C#,Design Patterns,Mvvm,Viewmodel,Models,我正在处理一个项目中的现有代码,该项目到处都有丰富的模型(而不是POCO)。基本上,有没有什么好方法可以在不重复代码的情况下混合使用富模型和视图模型 丰富的模型具有数据验证功能。有没有简单的方法可以在ViewModels中重用这些功能 例如: public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo { private Person _person; [Required] //This se

我正在处理一个项目中的现有代码,该项目到处都有丰富的模型(而不是POCO)。基本上,有没有什么好方法可以在不重复代码的情况下混合使用富模型和视图模型


  • 丰富的模型具有数据验证功能。有没有简单的方法可以在ViewModels中重用这些功能
例如:

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private Person _person;

    [Required] //This seems redundent...
    public String FirstName { ... }
}

public class Person
{
    [Required]
    public String FirstName { ... }
}
这只是一个例子。。。基本上,如果您有一个丰富的模型,那么在维护MVVM和避免冗余代码时,有没有办法利用它?我真的希望避免让我的模型成为任何数据上下文或被ViewModel完全公开

例如:

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private Person _person;

    //This seems like a bad thing to do...
    public Person ThePerson { get { return _person; } }
}

MVVM的一个想法是将表示层与数据层分离。这使您能够在不更改数据层数据的情况下更改表示层正在使用的数据

因此,来自表示层的数据仅在用户请求时写入数据层。冗余的FirstName属性用作图层边框,使您能够灵活地实现简单的“撤消所有更改”之类的操作

考虑使用一个通用的ValueViewModel来处理数据绑定所需的值更改通知。按照此方法,视图模型将类似于:

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private Person _person;

    [Required] //This seems redundent...
    public ValueViewModel<String> FirstName { ... }
}
公共类PersonViewModel:INotifyPropertyChanged,IDataErrorInfo
{
私人(私人),;
[必需]//这似乎是多余的。。。
公共价值视图模型名{…}
}
使用此模式,您的模型不需要实现INotifyPropertyChanged接口,该接口再次将表示层与数据层分离


MVVM是一种非常高级的模式,您经常会看到第一个视图中看起来有点正式的东西,但是遵循这种模式会给您很大的灵活性。如果您选择违反MVVM规则,则会危及整个应用程序的ArchiveTexture,因为这一违反会破坏您使用MVVM获得的灵活性。因此,如果您计划违反MVVM,请考虑根本不使用它。

我从未见过从视图模型中为视图公开整个模型有任何错误。我知道这不是“MVVM纯粹主义”的方法,但它简单、快速,而且效果很好

但我知道这两种方法都是同样有效的,而且通常对于一个非常大的代码库来说,从长远来看,模型和视图模型之间的分离会使工作更轻松。在这种情况下,为什么不让ViewModel验证返回ModelValidation?它不像使用数据注释那样漂亮,但您不会在多个位置创建验证

例如,我经常使用以下内容:

public string GetValidationError(string propertyName)
{
    string s = null;

    switch (propertyName)
    {
        case "FirstName":
        case "LastName":
            s = Person.GetValidationError(propertyName);
            break;
    }

    return s;
}

string IDataErrorInfo.this[string propertyName]
{
    get { return this.GetValidationError(propertyName); }
}

这是一个典型的问题

如果您用表示层特定的接口和属性“污染”了您的模型类,那么您可以通过只使用一个版本的任何逻辑模型来获得效率,但会失去表示和业务模型独立发展的能力

如果保持模型“纯”并维护一个单独的视图模型,则在每个视图模型中都会获得灵活性,但由于必须维护(以及在两个版本之间映射)而失去效率

从理论角度来看,对于更复杂的系统,我推荐后者。如果您的系统相对简单(想想CRUD),并且您不需要让这两种类型的模型独立发展,那么使用前者可能是相当安全的

显然,这两种方法并不是相互排斥的,在逐个屏幕的基础上作出决定也并非闻所未闻