2

我正在使用 C# 为我们的应用程序构建一个公共 API。我在与 WCF 客户端一起使用的 DTO 之上有一组外观类。它允许 API 使用者从数据库应用程序中获取、更新、创建等。标准的东西:客户有一个订单的集合,订单有一个行项目的集合,等等。

外观类都派生自一个公共基类,并覆盖执行验证、读取/写入 DTO 和其他管道的方法,所有这些都使用各种内部类型。我正在使用工厂来创建新对象并获取现有对象。

现在的问题是如何最好地通过 API 公开类,同时最大限度地减少实现细节的公开。

接口似乎是一种显而易见的方法,是限制暴露内容的最简单方法(并且最终可能无论如何都是必要的,因为正在考虑使用与 COM 兼容的接口)。接口方法的问题在于,在内部我的代码将依赖于接口的特定实现。

假设我有一个公开我的 CustomerFacade 的 ICustomer 接口,以及公开 OrderFacade 的 IOrder。在外部,ICustomer 有一个 IOrder 集合。但在内部,CustomerFacade 有一个 OrderFacade 集合。如果客户端应用程序向客户添加新的 IOrder,我必须检查 IOrder 是否真的是以前从我的工厂创建的 OrderFacade,而不是我控制之外的其他实现 IOrder 的对象。那是因为在内部我需要一个订单来做比 IOrder 可以做的更多的事情。

实际上,这并不重要——API 的用户不会尝试创建自己的 Order 实现。但这对我来说感觉很不雅,就像滥用接口契约的含义一样。

直接暴露外观类并不好,因为必须暴露整个类层次结构,以及受保护方法使用的内部类型,这会使 API 与消费者不会使用和不使用的类型混淆需要了解一下。

我能想到的另一种选择是另一层封装:一个包含私有 OrderFacade 并且只公开应该公开的成员的订单。但这似乎是为了有限的利益而增加了很多额外的代码。

我考虑过抽象基类,但由于继承结构,这并不比暴露外观类更好。例如,如果我有一个继承自 CatalogItem 的 ServiceItem,在两者之间引入一个抽象的 ServiceItemBase 仍然需要我在 CatalogItem 中公开所有受保护的方法。

关于这些方法的任何建议,或者我没有看过的替代方法?

4

2 回答 2

0

这似乎相当复杂。我不知道您要解决的业务问题,所以我不知道为什么需要各种外观。如果用户将使用您的 api 进行数据操作,您可以考虑使用命令来修改数据,并查询以返回仅包含客户端需要的数据的 DTO。

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613

这是一本可能会有所帮助的好书。

于 2013-03-13T14:30:24.477 回答
0

您还可以公开没有公共构造函数而不是接口的抽象类。这还有一个额外的优势,即抽象类可以作为非破坏性更改进行扩展,这对于接口而言并非如此。

使用internal访问修饰符可以隐藏在实现程序集之外不应该可见的成员。

于 2013-03-13T14:44:30.360 回答