假设我有以下方法:
public string GetSchedules(string request)
{
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return soapClient.GetSchedules(AuthenticationInfo, request);
}
}
public string GetCountryList(string request)
{
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return soapClient.GetCountryList(AuthenticationInfo, request);
}
}
public string GetCarriers(string request)
{
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return soapClient.GetCarriers(AuthenticationInfo, request);
}
}
正如您所看到的,唯一不同的是调用的方法的名称。我怎么能重构这些方法只应用“using”语句一次并避免代码重复?
答案 0 :(得分:6)
对我而言,你所拥有的一切都很好,但如果你想要考虑那些因素,你可以使用Func
和lambdas。这些方面的东西:
public string GetSchedules(string request)
{
return Worker((c) => c.GetSchedules(AuthenticationInfo, request));
}
public string GetCountryList(string request)
{
return Worker((c) => c.GetCountryList(AuthenticationInfo, request));
}
public string GetCarriers(string request)
{
return Worker((c) => c.GetCarriers(AuthenticationInfo, request));
}
private string Worker(Func<SoapClientClassGoesHere, string> f)
{
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return f(soapClient);
}
}
Func<A, R>
表示&#34;一个函数,它接受A
类型的参数并返回类型为R
&#34的值; (对于一个带有两个参数的函数,你可以Func<A, B, R>
。)。
有关this question和this question中Func<>
和lambdas的更多信息(以及更多,它是一个丰富的主题)。
这里是一个live example on ideone.com(一个非常愚蠢的实例,但它展示了这个概念):
using System;
using System.Collections.Generic;
class Foo {
public string GetSchedules(string request)
{
return Worker((c) => c[request]);
}
public string GetCountryList(string request)
{
return Worker((c) => c[request].ToUpper());
}
public string GetCarriers(string request)
{
return Worker((c) => c[request].ToLower());
}
private string Worker(Func<Dictionary<string,string>, string> f)
{
var d = new Dictionary<string, string>();
d.Add("1", "One");
d.Add("2", "Two");
d.Add("3", "Three");
return f(d);
}
}
public class Test
{
public static void Main()
{
var f = new Foo();
Console.WriteLine(f.GetSchedules("1"));
Console.WriteLine(f.GetCountryList("1"));
Console.WriteLine(f.GetCarriers("1"));
}
}
答案 1 :(得分:2)
那里真的没有多少重复。尽管如此,
public ServiceReference1.CustomDataTimetableToolKitServicesSoapClient NewClient()
{
return new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint)
}
using (var client = NewClient()) {
return soapClient.GetCountryList(AuthenticationInfo, request);
}
此外,由于所有方法都采用string
参数并返回string
,因此编写单个方法来调用它们很容易,将操作作为委托传递。不幸的是,我现在没有时间为你写这篇文章。
答案 2 :(得分:2)
您可以这样使用lambda函数:
public string GetCarriers(string request)
{
return Get((authInfo, request) => soapClient.GetCarriers(authInfo, request), request);
}
...
public string Get(Func<AuthenticationInfo, string, string> action, string request) {
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return action(AuthenticationInfo, request)
}
}
我不知道是否编译,但你明白了。
编辑: 正如@Tim S.注意到的,这段代码可能更短:
public string GetCarriers(string request)
{
return Get(soapClient.GetCarriers, request);
}
...
public string Get(Func<AuthenticationInfo, string, string> action, string request) {
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return action(AuthenticationInfo, request)
}
}
编辑2:客户端超出范围。所以正确的代码是:
public string GetCarriers(string request)
{
return Get((client, authInfo, request) => client.GetCarriers(authInfo, request));
}
...
public string Get(Func<ISoapClient, AuthenticationInfo, string, string> action, string request) {
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
return action(soapClient, AuthenticationInfo, request)
}
}
答案 3 :(得分:0)
如果您的Projekt不是很大,您可以使用以下内容(它有点乱,并且很容易出错):
public string getX (string request, string x)
{
using (var soapClient = new ServiceReference1.CustomDataTimetableToolKitServicesSoapClient(EndpointConfiguratioName, Endpoint))
{
switch (x)
{
case "schedules":
return soapClient.GetSchedules(AuthenticationInfo, request);
break;
case "countryList":
return soapClient.GetCountryList(AuthenticationInfo, request);
break;
case "carriers":
return soapClient.GetCarriers(AuthenticationInfo, request);
break;
}
}
}
}