根据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
没有太多可能性:
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(如果这很重要)
答案 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逻辑(应用程序行为),并且模型中存在业务逻辑和持久性。
你可以采取......等等的立场。您可能采用贫血数据模型方法;或者丰富的数据模型方法等。
没有一种正确的方法可以解决这个问题。失去了同样有效的方法。所有接近的两个关键点是:
答案 4 :(得分:-3)
通常,验证在ViewModel和Models上完成。 ViewModels倾向于注意与业务相关的逻辑,而Model'验证仅用于确保其数据有意义。例如,应在gender
模型上验证Person
属性。这是因为这是一个事实,性别只能是male
或female
,无论业务逻辑是什么。