さまざまなサーバーに接続してデータを読み取り、操作を実行するソリューションを開発しています。ファイアウォール、停止/失敗したサービス、認証の違い、さまざまなソフトウェア構成など、信頼できる通信を複雑にする多くの変数があります。これらの問題を回避するために使用できる方法がありますが、実行時にはどれが成功するかはわかりません。
私の目標は、操作を実行するために使用できるインターフェイスと実装を作成することです。最初のメソッド呼び出しは、ほとんどのデバイスで機能する最速の実装に対するものであり、その後に、前述の問題に対処できる他の呼び出しが続きます。
完璧な世界では、プロセスはどのメソッドが成功するかをすばやく特定するように記述されますが、私のテストでは、単純に例外をキャッチするのと同じくらい多くの処理時間がかかりました。パフォーマンスは常に考慮事項ですが、最終的には、タスクが正常に完了することがより重要です。
以下は私が作成した例で、実装のリストを繰り返し処理する最悪のシナリオを示しています。これは 1 つの方法ではうまく機能しますが、20 以上の異なる操作で使用される場合、DRY の原則には従いません。考えられる解決策の 1 つは Unity と Interception ですが、呼び出しハンドラの呼び出しメソッドは、可能な実装のリストではなく、解決済みの実装を使用していることがわかりました。何かが欠けていない限り、それは選択肢のようには見えません。また、いくつかのインターフェイスでこのパターンに従う必要があるため、実装のリストを反復処理できる汎用ハンドラーを作成するとよいでしょう。
このタスクを完了する方法についてアドバイスをいただければ幸いです。
インターフェース
public interface IProcess
{
int ProcessItem(string workType);
}
実装
public class ProcessImplementation1 : IProcess
{
public int ProcessItem(string workType)
{
throw new TimeoutException("Took too long");
}
}
public class ProcessImplementation2 : IProcess
{
public int ProcessItem(string workType)
{
throw new Exception("Unexpected issue");
}
}
public class ProcessImplementation3 : IProcess
{
public int ProcessItem(string workType)
{
return 123;
}
}
特別な実装は、1 つが例外なく成功するまで、他の実装をループします。
public class ProcessImplementation : IProcess
{
public int ProcessItem(string workType)
{
List<IProcess> Implementations = new List<IProcess>();
Implementations.Add(new ProcessImplementation1());
Implementations.Add(new ProcessImplementation2());
Implementations.Add(new ProcessImplementation3());
int ProcessId = -1;
foreach (IProcess CurrentImplementation in Implementations)
{
Console.WriteLine("Attempt using {0} with workType '{1}'...",
CurrentImplementation.GetType().Name, workType);
try
{
ProcessId = CurrentImplementation.ProcessItem(workType);
break;
}
catch (Exception ex)
{
Console.WriteLine(" Failed: {0} - {1}.",
ex.GetType(), ex.Message);
}
Console.WriteLine();
if (ProcessId > -1)
{
Console.WriteLine(" Success: ProcessId {0}.", ProcessId);
}
else
{
Console.WriteLine("Failed!");
}
return ProcessId;
}
}
}