我正在使用C#为我们的应用程序构建一个公共API。我在WCF客户端使用的DTO之上有一组外观类。它允许API使用者从数据库应用程序获取,更新,创建等。标准内容:客户拥有订单集合,订单包含行项目集合等。
Facade类都派生自一个公共基类,并覆盖执行验证,读/写DTO和其他管道内容的方法,所有这些都使用各种内部类型。我正在使用工厂来创建新对象并获取现有对象。
现在的问题是如何最好地通过API公开类,同时最大限度地减少实施细节的曝光。
接口似乎是一种显而易见的方法,作为限制暴露内容的最简单方法(最终可能是必要的,因为正在考虑与COM兼容的接口)。接口方法的问题在于我的代码内部将依赖于接口的特定实现。
假设我有一个暴露我的CustomerFacade的ICustomer接口,以及暴露OrderFacade的IOrder。在外部,ICustomer拥有一系列IOrders。但在内部,CustomerFacade有一组OrderFacades。如果客户端应用程序向客户添加了新的IOrder,我必须检查IOrder是否是以前从我的工厂创建的OrderFacade,而不是我控制之外的其他实现IOrder的对象。那是因为在内部我需要一个订单才能比IOrder做的更多。
实际上,这并不重要 - API的用户不会尝试创建自己的Order实现。但这对我来说感觉不雅,就像滥用界面合约应该是什么意思一样。
直接暴露外观类并不是很好,因为必须公开整个类层次结构,以及受保护方法使用的内部类型,并且使用消费者不会使用的类型混淆API。不需要了解。
我能想到的另一个选择是另一层封装:一个包含私有OrderFacade的Order,只暴露应该公开的成员。但这似乎是一些有限的利益的额外代码。
我考虑过抽象基类,但由于继承结构的原因,它不比暴露外观类更好。例如,如果我有一个继承自CatalogItem的ServiceItem,在它们之间引入一个抽象的ServiceItemBase仍然需要我公开CatalogItem中的所有受保护方法。
关于这些方法的任何建议,还是我没有看过的替代方案?
答案 0 :(得分:0)
这似乎很复杂。我不知道你试图解决的业务问题,所以我不知道为什么需要各种外墙。如果用户将使用您的api进行数据操作,您可以考虑使用命令修改数据,并查询返回仅包含客户端所需数据的DTO。
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613
这本书很有帮助。
答案 1 :(得分:0)
您还可以公开没有公共构造函数而不是接口的抽象类。这具有额外的优点,即抽象类可以作为非破坏性更改进行扩展,而接口则不然。
使用内部访问修饰符可以隐藏在实现程序集中不可见的成员。