Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Oop_Mvvm_Model - Fatal编程技术网

C# 模型演化与建筑设计查询

C# 模型演化与建筑设计查询,c#,.net,oop,mvvm,model,C#,.net,Oop,Mvvm,Model,视图模型,模型,MVVM架构问题 从前,我曾定义一个模型类,如下所示: public class Person { public string FirstName; public string LastName; } public class Person { private string firstName; private string lastName; public string FirstName {get{ return firstName;} set{ re

视图模型,模型,MVVM架构问题

从前,我曾定义一个模型类,如下所示:

public class Person
{
  public string FirstName;
  public string LastName;
}
public class Person
{
  private string firstName;
  private string lastName;

  public string FirstName {get{ return firstName;} set{ return firstName; } }
  public string LastName  {get{ return lastName; } set{ return lastName;  } }
}
几年后,我明白了如下定义模型类是一个更好的主意:

public class Person
{
  public string FirstName;
  public string LastName;
}
public class Person
{
  private string firstName;
  private string lastName;

  public string FirstName {get{ return firstName;} set{ return firstName; } }
  public string LastName  {get{ return lastName; } set{ return lastName;  } }
}
为什么。。因为通常它允许更多的通用性,例如:

public class Person
{
  private string firstName;
  private string lastName;

  public string FirstName {get{ return firstName;} private set{ return firstName; } }
  public string LastName  {get{ return lastName; } private set{ return lastName;  } }

  public Person(string firstName, string lastName)
  {
      this.firstName = firstName;
      this.lastName = lastName;
  }
}
publie interface IPersistable
{ 
   Guid Id {get;set;}
   DataAccessLayer Dal {get;set}
   void Persist();
   void Populate();
}

public class Person : INotifyPropertyChanged, IPersistable
{
  public DataAccessLayer Dal;

  private Guid Id;

  public Guid Id
  {
     get {return id;}
     set
     {
    id=value; 
    if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("Id");
     }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private string firstName;
  private string lastName;

  public string FirstName
  {
    get{ return firstName; }
    set
    { 
       firstName = value;
       if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
    } 
  }

  public string LastName
  {
    get{ return lastName; }
    set
    { 
       lastName = value;
       if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("LastName");
    } 
  }

  public void Persist() //assume this is part of IPersistable.
  {
    Dal.Persist(this);
  }

  public void Populate() //assume this is part of IPersistable.
  {
    var t=Populate(Id);
    FirstName = t.Firstname;
    LastName = t.LastName;
  }

}
几个月后,汽车性能推出,事情再次变得简单:

public class Person
{
  public string FirstName {get; set;}
  public string LastName  {get; set;}
}
而通用性仍然存在:

public class Person
{
  public string FirstName {get; private set;}
  public string LastName  {get; private set;}

  public Person(string firstName, string lastName)
  {
      FirstName = firstName;
      LastName = lastName;
  }
}
如果我们去上课的时候没有私人教练,那就再好不过了:

var myInstance = new Person{FirstName = "Che", LastName="Guara"}
到目前为止,非常好

但现在我们有了MVVM真正希望我们使用的另一个演变。。(在模型中!)

所以。。好啊它不像以前那么短,但可以接受

但如果模型的演变是某种东西的话,那么很自然

大家一致认为“不要重复你自己”是一个好原则

在许多情况下,我不需要特定的视图模型类,但并非所有情况下都需要

没关系

为什么改变对以对象为中心范式的整体态度是错误的

例如:

public class Person
{
  private string firstName;
  private string lastName;

  public string FirstName {get{ return firstName;} private set{ return firstName; } }
  public string LastName  {get{ return lastName; } private set{ return lastName;  } }

  public Person(string firstName, string lastName)
  {
      this.firstName = firstName;
      this.lastName = lastName;
  }
}
publie interface IPersistable
{ 
   Guid Id {get;set;}
   DataAccessLayer Dal {get;set}
   void Persist();
   void Populate();
}

public class Person : INotifyPropertyChanged, IPersistable
{
  public DataAccessLayer Dal;

  private Guid Id;

  public Guid Id
  {
     get {return id;}
     set
     {
    id=value; 
    if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("Id");
     }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private string firstName;
  private string lastName;

  public string FirstName
  {
    get{ return firstName; }
    set
    { 
       firstName = value;
       if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
    } 
  }

  public string LastName
  {
    get{ return lastName; }
    set
    { 
       lastName = value;
       if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs("LastName");
    } 
  }

  public void Persist() //assume this is part of IPersistable.
  {
    Dal.Persist(this);
  }

  public void Populate() //assume this is part of IPersistable.
  {
    var t=Populate(Id);
    FirstName = t.Firstname;
    LastName = t.LastName;
  }

}
因此,在a模块中的某个地方,我可以执行以下操作:

myObj.Persist();
这是一个错误的想法还是一个好主意?好的建筑还是坏的建筑

其中仍然存在关注点的分离——只是写得不同而已

真是让我头疼,谢谢你在这方面的意见

谢谢


G.Y.

关于<代码>INotifyPropertyChanged:MVVM要求您在ViewModels上使用它,因为WPF利用此接口在视图与其
DataContext
之间进行数据绑定,后者是MVVM中的ViewModel。除此之外,
INPC
只是一个通知属性更改的界面,可以在任何地方使用。人们通常认为它不应该在模型中实现,这是错误的,但您也不必这样做。如果您想在某个地方使用它,您只需要在您的模型上实现
INPC
,可能最常用于处理ViewModel中的这些更改。例如,如果模型仅因ViewModel的操作而更改,则无需实现
INPC

换句话说:模型不知道它在MVVM模式中使用的事实

因此,在设计模型时不要过多地考虑整个系统:它提供了更改通知:很好,它提供了持久性函数:很好,它是一个非常好的OOP类。这就足以使该模型成为MVVM的良好模型

编辑:

问题不是MVVM特定的imo。有必要问,对于一个类来说,表示实体(在本例中是个人)、通知属性更改(同样,INPC不是MVVM特定的)和维护持久性是否太多问题。通知和持久性是一种服务功能,您仍然可以在Dal中分离实际逻辑。那么,如果在应用程序中单独保存和加载实体是有意义的,为什么不呢?为什么你不应该那样做,你真正关心的是什么?当然,一个有两个属性的类会更好,但它总是一个折衷方案

简言之:我认为保存数据、维护数据的持久性和通知更改听起来像是一个很好的工作包,可以放入一个类中


让我知道这是否能令人满意地回答您的问题。

我同意您所写的内容—一般来说—但不同意—model不知道它在mvvm模式中使用的事实。。因为没有理由在模型中包含inpc,除非您在实践中使用mvvm——但是我确实接受,所包含的inpc正如您所说是完美的oop类。然而,它并没有回答我的问题。。我在示例中提到的最后一个类是否意味着“以对象为中心”方法或“以模型为中心”方法的不同方法是好的做法?如果可以使用inpc,为什么不让模型以示例所示的方式处理自己的持久性呢?除了MVVM之外,在模型中实现inpc还有很多原因。例如,如果引用对象的属性已更改,我的计算会将自身标记为脏。另一方面,在很多情况下,您的模型不需要INPC。INPC本身并不特定于MVVM。您只需要一个不同的触发器来同步您的VM(周期性地,或者在将更改推送到模型之后)。不管怎样,这是学术性的。。。正如我所说,在我看来,你的方法是完全正确的。我已经扩展了我的答案。谢谢,是的-它确实满足了我的问题:)