Design patterns 我的DAO层如何与表示层交互?

Design patterns 我的DAO层如何与表示层交互?,design-patterns,architecture,separation-of-concerns,Design Patterns,Architecture,Separation Of Concerns,我读了这本书,想找一本。如果您觉得这个问题仍然太长或不清楚,请让我知道,我会再试一次 我维护一个具有以下层/设计的N层业务线winforms应用程序: [WinForm应用程序] [基于MVP的表示层(CAB, 具体地说)] [服务层] [数据访问层] 应用程序通过使用特定于ERP/业务系统的DAO接口实现,与不同的ERP/业务系统集成,这些系统在DAO层处理,例如: public sealed class QBTransactionAssemblyBuildDAO : QBDAO, ITr

我读了这本书,想找一本。如果您觉得这个问题仍然太长或不清楚,请让我知道,我会再试一次

我维护一个具有以下层/设计的N层业务线winforms应用程序:

  • [WinForm应用程序]
  • [基于MVP的表示层(CAB, 具体地说)]
  • [服务层]
  • [数据访问层]
应用程序通过使用特定于ERP/业务系统的DAO接口实现,与不同的ERP/业务系统集成,这些系统在DAO层处理,例如:

public sealed class QBTransactionAssemblyBuildDAO : QBDAO, ITransactionAssemblyBuildDAO
public sealed class SAPTransactionAssemblyBuildDAO : SAPDABase, ITransactionAssemblyBuildDAO
例如,一个业务部门可以使用与QuickBooks集成的应用程序。这将在app.config中配置,工厂方法将在运行时创建适当的QB*DAO实现。同样,另一个部门可能会使用它与SAP集成,配置文件将支持这一点,工厂将生产SAP*DAO实现。然后,这些服务可以使用DAO,而不知道底层的集成系统

这一切都非常有效,事实上,由于我不得不添加额外的集成系统和记录支持,该设计已经收到了回报。今天,当我遇到一个集成应用程序的API不支持所有其他系统都能支持的任务的情况时,这一切都改变了。我现在的情况是,我需要支持异常流,而不是更新SAP中的数据,我需要向用户提供一个对话框,其中包含数据,以便他们手动转录(确定、复制和粘贴)到SAP应用程序用户界面

如果我遵守我的层和对象分离准则,那么我第一次分支应用程序流的机会是在服务层,因为该层了解集成了哪些ERP/业务应用程序。在服务层,我可以接收到“recognizedDelayedRevenue”的请求,获取我对具体DAO对象的引用,并询问它是否支持该操作(后一部分是新的)。如果它返回负数,我现在面临的设计挑战是向用户呈现一个对话框,包括使用属于DAO对象的方法预处理它呈现的数据

我的问题:从设计的角度来看,哪个是更大的罪恶:

  • 服务层试图创建和显示win32对话框,基本上打破了业务逻辑和表示的分离
  • DAO对象接受(即声称支持)请求,而不是针对其集成系统执行,它以某种方式向用户呈现一个对话框
  • 将集成系统知识降低到演示者级别,并在那里处理异常
  • 当然,如果你有一个我没有提到的想法,那也会非常有趣

    我会选择#3,但我会使用a来保持抽象级别。然后,当必须决定是否使用附加功能时,我会让演示层查询该界面的存在:

    if (myImpl is IAdditionalFeatureAware)
    {
        // ...
    }
    

    我是Fowler的粉丝,但角色界面以前并没有引起我的注意;谢谢你的链接。我正在努力研究如何将您的建议应用到我的3个参与层:将(或不将)实现角色接口的对象将是我的DAO对象,这对于表示层来说是未知的。您将如何让服务层参与此解决方案?我的服务声称要处理这个问题所涉及的任务,但直到它尝试使用DAO层,它才能检查角色接口。我希望这是有道理的。对我错过了那个细节。这使得它更加复杂,因为服务可能支持在接口用作堆栈的本机部分时查询接口,但如果它成为或是远程接口,则需要询问服务是否支持该功能,并作为响应的一部分获取答案。你也许可以这样做一次,然后抓住答案,而不是不断地询问?