2009-01-23 25 views
0

我正在處理通過接口加載不可信程序集的應用程序。每個程序集都應該能夠將一個或多個GameAction對象添加到服務器使用的線程安全隊列中。只寫隊列?

設計的第一次迭代是剛剛通過隊列 - 是這樣的:

public interface IGameClient 
{ 
    void HandleStateChange(IGameState gameState, 
         ref Queue<IGameAction> actionQueue); 
} 

但是,與此有關的問題是,它給共享隊列不可信組件入口,它允許操縱隊列中的其他成員並發現有關其他隊列操作的信息。

第二關是:

public interface IGameClient 
{ 
    void HandleStateChange(IGameState gameState); 
    GameActionDelegate event HasNewEvent; // passes IGameAction as a parameter 
} 

這裏的問題是,它並不一定允許訂購或行動組。

我真正希望的是能夠將引用傳遞給封裝線程安全隊列的對象,但只會公開Enqueue()。但是,我擔心一個不受信任的程序集可能會使用反射來操縱一個專用的Queue對象。

那麼,處理這個問題的最好方法是什麼?

回答

2

思想沒有特定的順序:

1)活動保證排序(或者至少,你的執行才能保證任何命令你想要的,最簡單的實現將保留排序)。

2)我不明白你爲什麼想在接口的第一個例子中通過引用來傳遞隊列。您可能需要檢查一下,您是否瞭解parameter passing and "ref"。 3)如果你想出一個只暴露Enqueue的接口,那麼推薦的實現方式不會是 a Queue<T>。它可能包含包含 a Queue<T>,但是如果您確實不相信程序集不會混淆您的私有成員,則應該加載它們,以免給它們相關的反射權限。

另一種替代方法可能是傳入一個Action<IGameAction>,客戶端可以在要將項目添加到隊列中時調用該項目。代理將從您擁有的任何Enqueue方法創建。

+0

「ref」並不是因爲它是必要的。這意味着第三方開發者會提示「這是爲了被操縱」(這是第一個草圖)。 – 2009-01-23 20:08:57

2

不要公開隊列 - 只需在facade上展示一個方法,該方法允許GameClient提交GameServer將放置在內部隊列中的條目。

0

你可以使HandleStateChange方法返回一個IEnumerable <IGameAction>,IList的<IGameAction>或IGameAction []:

public interface IGameClient 
{ 
    IGameAction[] HandleStateChange(IGameState gameState); 
} 

然後使用該返回值來操作添加到隊列中。

0

傳遞一個新創建的隊列實例,當HandleStateChange返回時,將虛擬隊列中的內容合併到實際隊列中。