我想制作一个小框架,我可以在许多有web服务的计算机上调用webservices。
所以,我有五台带有webservices的电脑。 每个ws提供2个函数(可能更多,但这是示例): DataFormat [] GetXData(int) Something [] GetYData(string,int)。
现在调用服务如下所示: ServiceClient wsc; DataFormat [] data = wsc.GetXData(5);
我计划这样的框架界面:
MultiWebservice mws; DataFormat [] data = mws.BroadcastQuery(wsc.GetXData(5));
可以看出,我希望注入iam的功能,感兴趣的是每个ws。并返回合并数据(合并不是帖子的主题。我自己处理)
我需要一个帮助,如何使用C#来使这个优雅,通用,如果没有必要, 没有很多函数重载,因为我不希望为每个不同的返回类型或新的重载 ws中的每个功能。
请给我建议。也许这个界面是错误的,可能会更好。
答案 0 :(得分:0)
不确定这是否有帮助,但你可以尝试调整一下:
public class WebServiceClient
{
public int[] GetXData(int intVar)
{
return new int[] { intVar, intVar };
}
}
public class BoardcastingWebServiceCleint
{
public int[] BroadcastQuery(Func<WebServiceClient, int[]> webServiceCall)
{
List<WebServiceClient> clients = new List<WebServiceClient>();
List<int> allResults = new List<int>();
foreach (WebServiceClient client in clients)
{
int[] result = webServiceCall.Invoke(client);
allResults.AddRange(result);
}
return allResults.ToArray();
}
}
static void Main(string[] args)
{
BoardcastingWebServiceCleint bwsc = new BoardcastingWebServiceCleint();
bwsc.BroadcastQuery((client) => { return client.GetXData(5); });
}
答案 1 :(得分:0)
要给出类似于Thomas Li的答案,但是为方法使用泛型类型参数,以允许任何返回类型:
public class WSClient {
public int GetPower (int var) { return var * var; }
public int[] GetDuplicatePowers (int var) {
return new[] { GetPower(var), GetPower (var) };
}
}
public class Multiplexer<T> {
IList<T> _sources;
public Multiplexer (IEnumerable<T> sources) {
_sources = new List<T> (sources);
}
public IEnumerable<TResult> Call<TResult> (Func<T, TResult> func) {
return _sources.Select (s => func(s));
}
public IEnumerable<TResult> AggregateCall<TResult> (Func<T, IEnumerable<TResult>> func) {
return _sources.SelectMany (s => func(s));
}
}
public class Test {
public static void Main (string[] args) {
var m = new Multiplexer<WSClient> (new[] { new WSClient (), new WSClient () });
var powers = m.Call (c => c.GetPower (2));
var agg_powers = m.AggregateCall (c => c.GetDuplicatePowers (2));
}
}