2011-03-17 71 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); }); 
}