C# 广播到许多Web服务类

C# 广播到许多Web服务类,c#,.net,web-services,C#,.net,Web Services,我想用它创建一个小框架,我可以在许多拥有webservice的计算机上调用webservice 所以,我有五台电脑,有网络服务。 每个ws提供2个功能可能更多,但以下是示例: DataFormat[]GetXDataint Something[]GetYDatastring,int 调用服务现在如下所示: 服务客户端wsc; DataFormat[]data=wsc.GetXData5 我计划这样的框架接口: 多网站服务; DataFormat[]data=mws.BroadcastQuery

我想用它创建一个小框架,我可以在许多拥有webservice的计算机上调用webservice

所以,我有五台电脑,有网络服务。 每个ws提供2个功能可能更多,但以下是示例: DataFormat[]GetXDataint Something[]GetYDatastring,int

调用服务现在如下所示: 服务客户端wsc; DataFormat[]data=wsc.GetXData5

我计划这样的框架接口:

多网站服务; DataFormat[]data=mws.BroadcastQuery wsc.GetXData5

如您所见,我希望在每个ws上注入iam感兴趣的函数。并返回合并后的数据合并不是post的主题。我自己处理

我需要一个帮助如何使用C使这个优雅,通用,如果它是没有必要的, 没有太多的函数重载,因为我不想为每个不同的返回类型或 ws中的每个函数


请给我一些建议。也许这个界面是错误的,可能会更好。

不确定这是否有帮助,但您可以尝试调整它:

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

要给出类似于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));
     }
 }