【问题标题】:MVVM and business layer architectureMVVM 和业务层架构
【发布时间】:2025-12-28 05:35:06
【问题描述】:

我正在开发一个我刚刚完成的应用程序:

  • 域层 - 以域驱动设计方式制作,所以我在这里有一些逻辑
  • 数据访问层 - 使用 nhibernate 和 UnitOfWork - 存储库模式
  • UI 层 - 带有 Caliburn.Micro 的 MVVM

现在的问题是:我的逻辑放在哪里?

根据

https://softwareengineering.stackexchange.com/questions/185448/mvvm-clarification

我必须将应用程序逻辑与域逻辑分开,但我做了一个简单的例子:

我有一个 ViewModel,它只向数据库中的一个人收费并允许更改,那么我将有 3 种方法(仅保留示例):

LoadPerson ( id )
SavePerson (Person )
CanEditPerson ( id )

前2个必须调用我UoW的对应方法但必须直接调用?

在之前用asp.net做的应用中,我创建了一个businessLayer,每个页面都有一个facade,所以页面调用facade的LoadPerson,然后BL调用数据访问层的LoadPerson

我可以在这里使用正确的方法吗?

但在这种情况下,页面非常复杂,并且可以处理各种对象:我有 6 个页面(充满了标签和手风琴),用于基于大约 100 个项目的应用程序。

这里我知道视图必须非常简单并且可能在单个对象上工作,然后我应该在 BL 中为每个 ViewModel 有一个外观?

CanEditPerson 必须是一种方法,验证建立的规则以确定当前用户是否可以更改人员。似乎很合乎逻辑的域(买家必须建立pemessi)拥有版权但我不知道如何处理DomainLayer中的这个东西,我会更自然地在BusinessLayer中拥有该方法

【问题讨论】:

  • 对于您的 DataAcessLayer,我向您推荐这个存储库框架:genericunitofworkandrepositories.codeplex.com 我认为上面的示例将帮助您找到答案。
  • 我会看的,但我已经以我非常喜欢的方式完成了一个存储库。我的问题是关于外观模式 e 域逻辑

标签: c# wpf mvvm architecture business-logic


【解决方案1】:

您也可以在这里创建一个模型并在其中声明属性和方法。 喜欢

 public class Person
    {
   //Declare your property

     LoadPerson ( id )
     {

      }
     SavePerson (Person )
     { 

      }
     CanEditPerson ( id )
     {

      }
    }

现在您只需在 ViewModel 中创建 Person 类的属性,以便您可以轻松访问它们的属性以及方法。

private Person _PersonDetails;

public Person PersonDetails
{
    get { return _PersonDetails??(_PersonDetails=new Person());}
    set { _PersonDetails = value;}
}

【讨论】:

  • 那么我的实体的持久性无知呢?并且 CanEditPerson 可以涉及其他实体工作,在某些情况下,我有复杂的存储过程来决定是否可以编辑记录(例如,如果没有人拥有它,则可以编辑活动,它处于特定状态等等)