根据MVVM模式 - 谁负责?

时间:2016-07-14 09:02:53

标签: c# wpf mvvm

根据MVVM,模型中应该没有逻辑。让我们假设一个Person模型包含两个属性:

public class Person {
    public string Costcenter { get; private set; }
    public User User { get; private set; }
}

User对象本身包含一个其他person对象,其中包含一个属性" Costcenter"。

public class User {
    public OtherPerson Person {get; private set; }
}

public class OtherPerson {
    public string Costcenter {get; private set; }
}
  

OtherPerson

完全不同

现在我的实际问题是:谁负责检查Costcenter in Person是否等于OtherPerson中的Costcenter?

Person.Costcenter == Person.User.OtherPerson.Costcenter

没有太多可能性:

  1. ViewModel负责
  2. 可以在Model
  3. 中实现一小段代码
  4. 支票可以实现为getter属性
  5. public ViewModel(){
        [...]
        public bool IsCostcenterEqual(Person p){
            return p.Costcenter == p.User.OtherPerson.Costcenter;
        }
    }
    
    public class Person {
        public string Costcenter { get; private set; }
        public User User { get; private set; }
        public bool CostcenterEquals(){
            return this.Costcenter == this.User.OtherPerson.Costcenter;
        }
    }
    
    public class Person {
        public string Costcenter { get; private set; }
        public User User { get; private set; }
        public bool IsCostcenterEqualProperty{
            get{
                return this.Costcenter == this.User.OtherPerson.Costcenter;
            }
        }
    }
    

    此时我不确定这只是一个意见问题,但我正在寻找解决此问题的最佳方法

      

    *)best =与MVVM模式相关的最佳拟合

    修改1

    我忘了提及我想将我的模型用于EF(如果这很重要)

5 个答案:

答案 0 :(得分:3)

我认为你在这里有比你想象的更多的课程。您的ViewModel类与MVC中的控制器执行类似的工作。他们不应该拥有你的任何业务逻辑,但是他们应该协调所做的类,这是你的应用程序逻辑。

所以我们有#34;应用逻辑"这是控制UI,将数据绑定到视图,以及执行用户执行/看到的内容与"业务逻辑"之间的集成。实现它周围的规则和不变量。

如果他们根本没有任何逻辑,那么他们就是数据传输对象,而且用处不大(DTO只是用于以已知的方式移动数据"形状" )。

业务逻辑通常位于"交易脚本" (通常我们使用类似IEmployeeService.HireNewEmployee(args])之类的方法将其实现为IPersonService或IEmployeeService等,或者,如果您的域对于系统的这一部分来说足够复杂,则可以使用"域模型。

无论您采用哪种方式,您都会发现ViewModel将调用实现业务逻辑的这些类。

答案 1 :(得分:0)

模型可以而且应该包含业务逻辑。 ViewModel不应包含任何业务逻辑,只包含与视图相关的逻辑。

答案 2 :(得分:0)

对于此特定方案,可以在View Model中添加逻辑。

记住责任 -

模型 - 任何逻辑,它是业务逻辑,并且是该特定模型或实体的规则,然后该逻辑应放在模型中。 例如 - 如果你有一个名为“发动机”的实体,那么可操作的发动机的实际业务详细说明了燃气被抽出的速度,所有基本操作都在发动机类中进行模型

视图模型 - 用于进行操作的任何逻辑,以便在UI上显示适当的数据

现在该引擎应该如何看待你需要做什么来管理UI,不会影响它的工作,只与UI有关,因此这些逻辑和细节应该放在View Model中。

答案 3 :(得分:-1)

正如其他答案和评论所示,这是一个引发很多激情和观点的话题。没有人"对"这样做的方法。

您可以采取模型只是一组DTO / POCO或任何您想要调用它们的位置。然后,您的持久性和业务逻辑层存在于ViewModel中。

您可以采取模型是持久层的立场,负责仅保留DTO并且业务逻辑存在于ViewModel中。

您可以采取以下立场:ViewModel仅负责处理View逻辑(应用程序行为),并且模型中存在业务逻辑和持久性。

你可以采取......等等的立场。您可能采用贫血数据模型方法;或者丰富的数据模型方法等。

没有一种正确的方法可以解决这个问题。失去了同样有效的方法。所有接近的两个关键点是:

  1. 决定一种方法并坚持下去。在整个解决方案中保持一致。
  2. 无论采用何种方法,都要确保图层正确分离。

答案 4 :(得分:-3)

通常,验证在ViewModel和Models上完成。 ViewModels倾向于注意与业务相关的逻辑,而Model'验证仅用于确保其数据有意义。例如,应在gender模型上验证Person属性。这是因为这是一个事实,性别只能是malefemale,无论业务逻辑是什么。