Model view controller 业务层中的模块分离

Model view controller 业务层中的模块分离,model-view-controller,architecture,3-tier,Model View Controller,Architecture,3 Tier,我们的新项目刚刚开始,我们有一个与其架构相关的问题 我们有一个3层架构: WebUI 生意 数据存储库 每个层仅对其下方的层具有引用。与我们所称的实体和业务对象(BO)的通信如下: DataRepositories <--entities--> Business <--BO--> WebUI DataRepositories业务WebUI 表示使用类型为X的对象进行通信 例如,我们有UserEntity作为实体和User作为BO。另一种类型是票证,它同样具有ticke

我们的新项目刚刚开始,我们有一个与其架构相关的问题

我们有一个3层架构:

  • WebUI
  • 生意
  • 数据存储库
  • 每个层仅对其下方的层具有引用。与我们所称的
    实体
    业务对象
    (BO)的通信如下:

    DataRepositories <--entities--> Business <--BO--> WebUI
    
    DataRepositories业务WebUI
    
    表示使用类型为X的对象进行通信

    例如,我们有
    UserEntity
    作为实体和
    User
    作为BO。另一种类型是票证,它同样具有
    tickettenty
    ticket

    目前,我们在数据存储库、业务和WebUI中为用户提供了一些不同的垂直层,这些层具有类似于
    帐户的内容,这些内容定义良好,不与其他层交互,如
    票证

    现在的问题是,一张票有一个买主,买主是一个用户,我们不知道在我们的体系结构中应该在哪里连接票和用户。业务组件应该在它们之间交互还是数据层应该将用户映射到票据


    更具体地说,我们有一种方法来创建驻留在业务中并从WebUI调用的票证。它以票证和“用户”的详细信息作为参数,我们还不知道它是user类型的对象还是username/id类型的对象。如果我们传递一个user对象,则演示文稿应该在调用CreateTicket之前获取该用户。但是,如果webui传递id,那么业务层应该解析用户对象,这需要在Tickets(business)中添加对用户业务组件的引用。

    我个人讨厌这样的并行层次结构。您已经创建了您所调用的实体,这些实体应该有一些与之相关联的行为,加上一个并行的业务对象层次结构,这些业务对象应该是不可变的,没有任何行为

    我会放弃商业目标。我怀疑除了不变性和其他人的“架构纯度”概念之外,它们没有提供任何你可以引用的价值

    我也不喜欢实体和存储库之间的箭头方向。我想让存储库知道实体,但不是相反。为什么实体应该知道或关心它是否持续存在?业务逻辑和行为应该保持不变

    我会让视图层与服务交互。这些是UI不可知的,但它们包含了实现用例的所有业务逻辑。如果你扔掉你的用户界面——你每隔几年就会扔掉一次——你的服务将在业务问题发生的时间内保持不变

    数据层应负责其自身的引用完整性。如果票证需要加入才能找到它的用户,那么必须将它放在数据层中。当持久化层查询某个用户时,它还将获取属于该用户的票证,并在对象中返回one-to-may关系。用户将拥有一个列表或一组票证实例。所有这些都应该在服务层中完成。该服务将协调持久性、业务对象和实现用例所需的其他服务