2013-02-06 44 views
0

起初我有一個LINQ查詢(說EF或任何其他)預計遞延執行:是否可以通過WCF實現/保留延遲執行?

class Provider : IProvider 
{ 
    public IEnumerable<Any> GetSome() 
    { 
     yield return new Any(); // LINQ query 
    } 
} 

但現在這樣一個提供移動到一個WCF服務(和IOC):

unityContainer.RegisterType<IProvider>(
    new PerResolveLifetimeManager(), 
    new InjectionFactory(c => new ChannelFactory<T>("IService").CreateChannel())); 

是有可能通過WCF調用保留延遲執行?

+0

你預計會發生什麼?客戶是否要求每件物品?因爲這是通過電線推遲執行所需要的。 –

+0

@DanielHilgarth:是的,我想知道是否有可能在實現時要求每個項目輪流輪流。下面是一個例子:我有一些重要的EF調用,WCF客戶端必須等待它完成,而不是序列化整個結果集,反序列化它,並且只能開始迭代。而不是開始處理之前的第一個結果將從數據庫讀取/從服務接收。 – abatishchev

+0

這是關於流媒體 - 而不是延期執行...即使使用WCF流媒體,它可能無法正常工作。您將不得不進行非常低級別的HTTP(分塊編碼)或TCP編程來實現這一點。 –

回答

1

這個答案實際上是您對Ladislav Mrnka最後評論的答案。你說:

好吧,我明白了,所以沒有「免費的甜甜圈」可能。在LINQ to Any中,我們有這樣的行爲,但有必要跨越服務邊界,即數據被(序列化),打破它,對吧?

雖然它不是免費的,但它仍然是可能的!

在服務器端,你必須提供一個初始化請求的方法和一個方法來逐個獲取結果。

在客戶端 - 特別是在其低級別的基礎設施類中 - 您可以將其包裝在枚舉器中,最後,您的「業務」類可以像使用其他枚舉器一樣使用該枚舉器。

我們已經討論過,它會在每個項目所需的請求 - 響應方式中引入額外開銷。這會引入延遲並增加網絡負載。

使用僞的RESTful API可能看起來像這樣這種方法的一個樣本:

服務器端:

  • POST http://server/api/search-specification
    主體包含需要爲您的搜索,例如參數開始日期和結束日期
    響應將是標識搜索規範的URI。
  • GET http://server/api/search-specification/1/next-result
    迴應將是下一個項目。

這個控制器看起來是這樣的:

public Response PostSearchSpecification(SearchSpecification spec) 
{ 
    int id = _searches.Max(x => x.Key) + 1; // Make thread-safe 
    _searches[id] = _provider.GetSome().GetEnumerator(); 
    return ...; 
} 

public Item GetNextResult(int searchSpecId) 
{ 
    if(_searches[searchSpecId].MoveNext()) 
     return _searches.Current; 
    else 
     return null; // or return a HTTP status code that tells the 
        // client that there are no more items. 
} 

我稱它是假的RESTful API,因爲它肯定看起來像一個,但它需要在內部保持狀態,每種規格啓用延期執行。另外GET http://server/api/search-specification/1/next-result不是冪等的。
但我認爲這證明了我的意思:)

的客戶端會以某種方式封裝它是這樣的:

class Search 
{ 
    public IEnumerable<Item> Start(params) 
    { 
     var client = new HttpClient(...); 
     var resultsUri = client.Post(new SearchSpecification(params)).Response; 
     Item item = client.Get<Item>(resultsUri); 
     while(item != null) 
     { 
      yield return item; 
      item = client.Get<Item>(resultsUri); 
     } 
    } 
} 

而且你會使用這樣的:

var search = new Search(); 

foreach(var item in search.Start(...)) 
    // ... 

只是一個關於如何實現這樣的東西的原始素描。

相關問題