2009-11-24 35 views
1

在類庫我目前的工作,我需要實現一種機制,其中級用戶將通過在發行人類操作獲得一個項目的擱置:如何在C#中實現「問題並提交回」模式?

class Issuer { 
    public Item GetItem() { 
     return queue.Pop(); 
    } 
} 

//at some other place 
var item = issuer.GetItem(); 
//work on item and submit back to Issuer 

我如何能實現這種模式,其最小化班級用戶甚至不願意提交回來的風險?

我的優先順序是:

  • 類用戶不必明確提交該回
  • 類用戶明確提交該回,但它無法脫身而不提交(例外???)
  • 是可能的,即使僥倖沒有提交它回來,但設計鼓勵用戶不要做

我知道這是不是一個晶瑩剔透的問題,而是一個上面實施的建議/設計模式將會有所幫助!

回答

2

這樣做的一種方法是使用IDisposable接口。通過這種方式,用戶可以可能利用using語句的使用過程:

using (var item = issuer.GetItem()) 
{ 
    // Work on item 
} // Item is released on Dispose() 

發行人可以簡單地聽一個事件來獲取項背。但是,如果物品得到傳遞,它可能不是你最好的選擇。在這種情況下,一個簡單的Close()Release()方法(再次讓發行者監聽一個事件)可能只是訣竅。

在大多數情況下,用戶最好明確 - 以某種方式 - 釋放獲取的項目。

如果某些強人所難用戶省略釋放一個項目,你總是可以與標準的Dispose模式沿依傍終結。但是,您必須非常小心而不是復活該項目(保留參考一旦完成)。

+0

謝謝。我喜歡使用Dispose模式的提示,但不幸的是,項目的使用可能會在多個方法中傳播。你的建議傾聽事件可能是有用的。我是否應該強制用戶實現一個有我可以聽到的事件的界面? – Hemant 2009-11-24 13:55:31

+0

在Item上聲明一個事件,例如'Close'或'Released'(用戶調用'Close()'或'Release()'時調用)就足夠了。用戶不會被約束來執行任何操作。發行人會傾聽這些事件並*重新獲得對該項目的控制權*。 – 2009-11-24 13:58:50

+0

我真的不知道爲什麼我堅持關閉和釋放;它可能很容易被Sumbit! – 2009-11-24 14:01:49

2

維護已發佈項目的集合,可能存儲它們何時發佈以及發佈給它們的類。這樣你就不必明確重新提交物品。 顯然,重新提交從已發佈集合中刪除。然後,您可以根據在許多方面,如果已發行集合中還會有項目「髒」數據拋出異常的選項 ,你可以:從請求類

  • 處理事件,如果你存儲在例如形式closing事件
  • 定期拋出一個錯誤時拋出比X
  • 舊的所有項目,如果優秀的項目數必須高於某一閾值

有一兩件事我想說的是也許是尋找到一個靜態的發行人,而不是我有沒有作爲一個實例方法。

+0

其實,這是非常優雅的。如果他想強制執行所有返回的項目,那麼在進程結束時拋出一個自定義的異常,如果發佈的計數大於零。 – emptyset 2009-11-24 13:53:13

2

這聽起來像IDisposable可能在這裏很有用。怎麼樣:

class Item { }

class Issuer: IDisposable 
{ 
    Queue<Item> queue = new Queue<Item>(); 
    List<Item> deliveredItems = new List<Item>(); 

    public Item GetItem() 
    { 
     Item item = queue.Dequeue(); 
     deliveredItems.Add(item); 
     return item; 
    } 

    public void SubmitItem(Item item) 
    { 
     deliveredItems.Remove(item); 

     // do some operation here 
    } 

    public void Dispose() 
    { 
     foreach (Item item in deliveredItems) 
     { 
      SubmitItem(item); 
     } 
    } 
} 

只要您的髮卡行設置,每個尚未提交回將被自動提交回交付項目。

+0

感謝您的回答(真的很有意思),但在應用程序中只會有一個Issuer實例。項目的單一來源。任何更多的建議...... – Hemant 2009-11-24 13:59:29

+0

正如我在我的答案中提到的,考慮將其設爲靜態,那麼如果只能有一個發行者 - 它可以防止多個發行者意外發生的問題 – Chris 2009-11-24 16:14:25

+0

是的,這裏的單身人士是個好主意。 – 2009-11-24 16:24:16

-1

使用事件讓發行人知道已收到物品並使用事件將其傳回給髮卡機構。

託尼