2011-03-17 64 views
0

我想制作一个小框架,我可以简单地调用webservice上的许多计算机上的webservice。向多个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

为了让类似托马斯·李的答案,但使用泛型类型参数的方法,允许任何返回类型:

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