C# 创建包装器以隐藏数据结构的实现细节

C# 创建包装器以隐藏数据结构的实现细节,c#,.net,oop,C#,.net,Oop,我有一些集成(比如Salesforce),我想隐藏在产品无关的包装(比如CrmService类而不是SalesforceService类)后面 看起来很简单,我可以创建一个CrmService类并将SalesforceService类用作CrmService中的实现细节,但是,有一个问题。SalesforceService使用一些异常和枚举。如果我的CrmService抛出SalesforceExceptions,或者您被要求使用SalesforceEnum,那会很奇怪 有什么办法可以干净利落地

我有一些集成(比如Salesforce),我想隐藏在产品无关的包装(比如CrmService类而不是SalesforceService类)后面

看起来很简单,我可以创建一个CrmService类并将SalesforceService类用作CrmService中的实现细节,但是,有一个问题。SalesforceService使用一些异常和枚举。如果我的CrmService抛出SalesforceExceptions,或者您被要求使用SalesforceEnum,那会很奇怪

有什么办法可以干净利落地完成我想要的吗


编辑:目前对于例外情况,我正在捕获Salesforce one并抛出我自己的自定义一个。不过,我不确定我应该为枚举做些什么。我想我可以将Salesforce枚举映射到我自己的与提供商无关的枚举,但我正在寻找一个比必须进行映射更简洁的通用解决方案。如果这是我唯一的选择(映射它们),那么这没关系,只是尝试获取想法。

为了利用良好的OOP实践,我将创建一个小型界面
ICrm
,其中包含所有CRM的共同基本成员。此接口将包括典型的方法,如
MakePayment()
GetPayments()
CheckOrder()
,等等。还可以创建所需的枚举,例如
OrderStatus
ErrorType

然后创建并实现实现接口的特定类,例如
类CrmSalesForce:ICrm
。在这里,您可以将此特定CRM(在这种情况下为SalesForce)的特定详细信息转换为您的通用ICrm。枚举可以转换为字符串,如果必须的话,也可以转换为字符串()


然后,作为最后一步,创建
CrmService
类并在其中使用依赖项注入(),也就是说,将一种类型的
ICrm
作为其构造函数中的参数传递(或者如果愿意,传递方法)。通过这种方式,您可以保持CrmService类的内聚性和独立性,因此您可以创建和使用不同的Crm,而无需更改大部分代码

简单的回答是,你走的是正确的道路,请通读一下

基本概念是给定对象应假定为 尽可能少地了解其他事物的结构或性质 (包括其子组件),根据 “信息隐藏”

遵循德米特定律的优点是产生的 软件往往更易于维护和适应。自对象 较少依赖于其他对象的内部结构,对象 容器可以在不返工调用者的情况下进行更改

虽然也可能导致必须编写多个包装器 方法将调用传播到组件;在某些情况下,这可能会 增加明显的时间和空间开销

所以你看,你正在遵循一个很好的实践,我通常也会遵循,但这确实需要一些努力

是的,你必须捕捉并抛出你自己的异常,映射枚举、请求和响应,这需要大量的前期工作,但如果你在几年内不得不更换Salesforce,你将被视为英雄


与所有软件开发一样,如果您认为您可能永远不会改变salesforce,那么您需要将精力与将获得的收益进行对比?那真的需要吗。。。由您决定。

您不能捕获SalesforceException并抛出您自己的自定义异常吗?@Nick yup,但对枚举有什么想法吗?编辑:顺便说一句,我会编辑我的问题,说这就是我目前为例外所做的。总的来说,我希望有一种更好的架构方法。不幸的是,除了映射枚举之外,我没有其他建议。不是最漂亮的,不是,但它可以工作。我在其他地方使用这种模式,但是在我们的应用程序已经被设置的情况下,它不适合这里。谢谢你的建议!我同意你的建议