gpt4 book ai didi

c# - 多次实现尝试

转载 作者:行者123 更新时间:2023-11-30 18:02:00 25 4
gpt4 key购买 nike

我正在开发一个解决方案,它将连接到各种服务器以读取数据和执行操作。有许多变量会使可靠的通信变得复杂,例如防火墙、停止/失败的服务、身份验证差异和各种软件配置。我可以使用一些方法来解决这些问题,但在执行时还不知道哪种方法会成功。

我的目标是创建可用于执行操作的接口(interface)和实现。第一个方法调用将是最快的实现,适用于大多数设备,然后是可以处理前面列出的问题的其他调用。

在一个完美的世界中,流程将被编写为快速识别哪个方法会成功,但在我的测试中,处理时间与简单地捕获异常一样多。虽然性能始终是一个考虑因素,但最终更重要的是成功完成任务。

下面是我创建的一个示例,它演示了迭代实现列表的最坏情况。虽然这对一种方法很有效,但当用于 20 种或更多不同的操作时,它并不遵循 DRY 原则。一种可能的解决方案是 Unity 和拦截,但我发现调用处理程序中的 invoke 方法使用已解析的实现,而不是可能实现的列表。除非我遗漏了什么,否则这似乎不是一个选择。此外,我将需要对多个接口(interface)遵循此模式,因此创建一个可以遍历实现列表的通用处理程序会很好。

如有任何关于如何完成此任务的建议,我们将不胜感激!

界面

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;
}
}

Special Implementation 循环遍历其他实现,直到一个实现无一异常(exception)地成功

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;
}
}
}

最佳答案

您可以将处理操作实现为通用扩展方法,您传递一个方法来处理单个项目:

public static int ProcessItems<T>(this IEnumerable<T> items, Func<T, int> processMethod)
{
foreach (var item in items)
{
try
{
return processMethod(item);
}
catch(Exception) {}
}
return -1;
}

现在您已经分析出项目的实际类型以及您使用的处理方法。唯一“固定”的是泛型方法的结果类型,它是一个整数。

对于您当前的示例,您可以这样调用它:

List<IProcess> implementations = ...;
int processResult = items.ProcessItems(x => x.ProcessItem(workType));

关于c# - 多次实现尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com