我正在开发一个库来映射 Nat 设备中的端口。这些 Nat 设备使用不同的协议(及其版本)来映射端口、获取外部 IP 地址、查找可用端口、列出它们、释放它们等。
所以,我为他们每个人准备了一堂课:
- UpnpWanIPConnection1
- UpnpWanIPConnection2
- UpnpWanPPPConnection1
- UpnpWanPPPConnection2
- 点对点
- 五氯苯酚
它们中的每一个都共享一些常见的操作,例如 AddPorMapping、GetExternalIP、RemovePortMapping,然后,它们实现了一个接口 INat。
该库可以按如下方式使用:
var natDevice = NatDiscovery.Discover(); // it returns an INat instance
natDevice.AddPortMapping(100, 100, "tcp");
问题是其中一些包括额外的操作,例如。GetAllMappings 而其余的则没有。然后,如果我将那些非共享操作作为接口的一部分包含在内,那些不实现该操作的设备(因为不是它们支持的协议的一部分)将需要抛出 NotSupportedException,这对谁来说是非常糟糕的使用图书馆。看一看:
var natDevice = NatDiscovery.Discover();
try{
list = natDevice.GetPortList();
}
catch(NotSupportedException)
{
// sorry, your device donnot support listing
}
我在考虑 CanGetPortList、CanDoThis、CanDoThat 等属性,但我不喜欢它。
当前的方法(抛出 NotSpportedException)是最好的方法吗?