【问题标题】:Is this the Crudy anti pattern?这是 Crudy 反模式吗?
【发布时间】:2011-01-28 00:19:54
【问题描述】:

目前我正在创建一个 WCF 服务,它必须连接到一个 DAL,它只使用 ADO.net 和存储过程连接到一个数据库。

DAl 将其来自数据库的响应写入数据合约,该数据合约通过服务通过线路传递给客户端。

我读到这可能是反模式“CRudy 接口”,但我不确定我是否正在共享数据合同。

如果我使用反模式,谁能建议一个更好的模式用于我需要的行为?

【问题讨论】:

    标签: wcf soa


    【解决方案1】:

    嗯,关于 CRUDy 模式及其优缺点似乎存在一些争议。至少,我会调用一个服务接口,让你编写这种代码来使用它作为反模式(如注释here):

    service.CreateCustomer(c);
    
    foreach(Group group in c.Groups)
    
      service.AddCustomerToGroup(c.CustomerId, group.GroupId);
    
    foreach(Person person in c.Contacts)
    
      service.AddCustomerContact(c.CustomerId, person);
    

    暴露 CRUDy 接口本身是不是很糟糕?我不会这么说的。重要的是提供一个接口,它将

    1. 封装有关底层流程的知识
    2. 不要很健谈

    【讨论】:

    • CRUD 接口的问题在于,它通常会导致违反第二条规则,因为必须进行多次调用才能执行任何远程复杂的操作 - 这将是“健谈”。
    • CRUD 接口的危险在于它鼓励多次调用。例如,为了处理一个订单,可能有一个 InsertOrder 和 InsertOrderLine 方法——两个接口调用。这与使用一种定义明确的接口方法来处理整个事务形成对比。
    • 我想这两种方法会共享逻辑。你会公开什么样的接口来支持“下订单”用例?
    • 首先,我只有一种处理订单的方法,我参考的论文中的“面向服务的四个原则”是一个很好的清单。
    • 嗯...我认为术语“CRUDy”的模糊性使其成为一个有争议的主题。我(可能错误地)认为 insertOrder() 是一个 CRUDy 概念,即使我要实现它,它也会处理订单行插入,以及下新订单时发生的所有其他事情。无论如何,我已经为您链接到的论文添加了书签,以便更详细地阅读。 :)
    【解决方案2】:

    看起来确实像 CRUD 接口反模式,但最好看看一些接口示例来确认。

    这个paper 对设计更好的服务接口进行了很好的讨论。

    它包括对 CRUD 反模式的批评和替代

    【讨论】:

      【解决方案3】:

      如果您要实现一个简陋的用例,您将得到一个简陋的界面,别担心。反模式是当你以粗鲁的方式实现非粗鲁的东西时。

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        相关资源
        最近更新 更多