gpt4 book ai didi

c# - 我如何重构类似的方法来消除重复的设置和异常处理?

转载 作者:行者123 更新时间:2023-11-30 21:27:52 25 4
gpt4 key购买 nike

上下文:

我使用 ERP WebService 公开 N 个方法,例如:

FunctionNameResponse FunctionName(FunctionNameQuery query)

我制作了一个功能包装器,以便:

  • 摆脱每个方法都有的包装对象 FunctionNameResponseFunctionNameQuery
  • 所有程序的一个 WebService 实例。
  • 调查并记录包装器中的错误。
  • 使用 IClientMessageInspector 调查慢速运行和 Soap 信封


重复代码:

对于 WebService 的每个方法,我最终得到大约 30 行代码,其中只有 3 个不同的词。键入响应,键入查询,方法名称。

public FooResponse Foo(FooQuery query)  
{
// CheckWebServiceState();
FooResponse result = null;
try
{
result =
WSClient
.Foo(query)
.response;
}
catch (Exception e)
{
// SimpleTrace();
// SoapEnvelopeInterceptorTrace();
// TimeWatch_PerformanceIEndpointBehaviorTrace();
}
return result;
}

我想减少这些重复。为了:

  • 使添加方法更容易;
  • 避免在不需要理解自己在做什么的情况下复制粘贴编程。
  • 更容易添加特定的捕获和新测试,而无需在每个方法中复制过去。

以下代码仅存在于虚构的领域中。根据我有限的理解,这不是我的解决方案的功能性草图。

public class Demo
{
public enum WS_Method
{
Foo,Bar,FooBar
}
public class temp
{
public Type Query { get; set; }
public Type Response { get; set; }
public WS_Method MethodName { get; set; }
}
public static IEnumerable<temp> TestFunctions =>
new List<temp>
{
new temp{Query=typeof(FooQuery), Response=typeof(FooResponse), MethodName=WS_Method.Foo },
new temp{Query=typeof(BarQuery), Response=typeof(BarResponse), MethodName=WS_Method.Bar },
new temp{Query=typeof(FooBarQuery), Response=typeof(FooBarResponse), MethodName=WS_Method.FooBar },
};
public static void Run()
{ // Exemple of consuming the method
var input = new BarQuery { Bar_Label = "user input", Bar_Ig = 42 };

BarResponse result = Execute<BarQuery, BarResponse>(input);
}
public static T2 Execute<T1,T2>(T1 param) {
//Get temp line where Query type match Param Type.
var temp = TestFunctions.Single(x => x.Query == typeof(T1));
var method = typeof(DemoWrapper).GetMethod(temp.MethodName.ToString(), new Type[] { typeof(T1) });
var wsClient = new DemoWrapper();

T2 result = default(T2);
try
{
result =
method
.Invoke(wsClient, new object[] { param })
.response;
}
catch (Exception e)
{
// SimpleTrace();
// SoapEnvelopeInterceptorTrace();
// TimeWatch_PerformanceIEndpointBehaviorTrace();
}

return result;
}

}

我知道反射很重,也许这不是实现此重构的正确方法。所以问题是:

如何重构这些函数?

附件:现场演示https://dotnetfiddle.net/aUfqNp .

最佳答案

在这种情况下:

  • 你有一个更大的代码块,大部分是重复的
  • 唯一的区别是在较大的 block 中调用了较小的代码单元

您可以通过将较小的代码单元作为 FuncAction 作为参数传递给较大的函数来重构它。

在这种情况下,您的较大函数如下所示:

public TResponse GetResponse<TResponse>(Func<TResponse> responseFunction)
{
var result = default(TResponse);
try
{
result = responseFunction();
}
catch (Exception e)
{
// SimpleTrace();
// SoapEnvelopeInterceptorTrace();
// TimeWatch_PerformanceIEndpointBehaviorTrace();
}
return result;
}

调用它的各个函数如下所示,没有所有重复的代码:

public FooResponse Foo(FooQuery query)
{
return GetResponse(() => WSClient.Foo(query));
}

关于c# - 我如何重构类似的方法来消除重复的设置和异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57040700/

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