1

我正在开发一个库来映射 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)是最好的方法吗?

4

3 回答 3

0

您可以尝试为这些特殊情况创建不同的接口,并尝试转换您的类型:

public Interface IPortListGetter
{
   void GetPortList();
}

var natDevice = NatDiscovery.Discover(); 
var portGetter = natDevice as IPortListGetter;
if (portGetter != null)
{  
    portGetter.GetPortList();
}
于 2014-05-13T20:15:23.840 回答
0

您可以从您的接口继承到其他接口,因此您将拥有一个核心接口并从中继承花哨的接口,因此您可以为任何类选择最佳接口。

于 2014-05-13T20:33:08.543 回答
0

框架中有“能力”属性的先例,用于向调用者指示成员将抛出NotSupportedException.

例子:

  • IList<T>.IsReadOnly=> 如果为假,IList<T>.Add()类似的会抛出

  • DbProviderFactory.CanCreateDataSourceEnumerator

就您个人而言,我会添加Can...属性,但这是一个主观决定,您似乎意识到需要考虑的权衡。

于 2014-05-13T20:44:04.183 回答