1

Nat デバイスのポートをマップするライブラリを開発しています。これらの Nat デバイスは、さまざまなプロトコル (およびそのバージョン) を使用して、ポートのマッピング、外部 IP アドレスの取得、使用可能なポートの検索、一覧表示、解放などを行います。

したがって、それぞれに1つのクラスがあります。

  • UpnpWanIPConnection1
  • UpnpWanIPConnection2
  • UpnpWanPPPConnection1
  • UpnpWanPPPConnection2
  • Pmp
  • PCP

これらのそれぞれは、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=> false の場合IList<T>.Add()、同様のものがスローされます

  • DbProviderFactory.CanCreateDataSourceEnumerator

個人的にあなたの状況では、Can...プロパティを追加しますが、それは主観的な決定であり、考慮する必要があるトレードオフを認識しているようです。

于 2014-05-13T20:44:04.183 に答える