2012-06-07 48 views
1

我有一個我想要獲得意見的架構情況。提供者模型依賴注入在C#中的實現

我有一個我正在開發的撲克系統。目前我有很多不同類型的遊戲,目前由不同類別處理(當然有一個共同的界面)。

遊戲包括德州撲克,奧馬哈嗨,奧馬哈高/低,7張牌梭哈,7張牌拉斯維加斯,倫敦Lowball和追隨女王。我預計未來會有更多。

目前,我正在使用提供者模型,類似於SQL連接字符串。交易是,遊戲的所有類型名稱都位於app.config文件中。

我正在考慮將類型放在數據庫中,因此不需要觸摸配置文件。然後當我開發一款新遊戲時,安裝程​​序可以複製一個新的DLL和一個腳本來插入可以調用DB的遊戲類型。

有沒有更好的方法來動態地允許這種類型的依賴?

回答

3

也許你甚至可以做到這一點,而無需更新數據庫。既然你把一個遊戲放在一個DLL中,爲什麼不在DLL的元數據中包含遊戲的名字呢?例如,你可以有遊戲的名稱作爲類屬性:

[Game("Texas Hold Em")] 
public class TexasHoldEm : Game 
{ 
} 

遊戲加載插件可以做如下:

string pluginDirectory = 
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
     "Plugins"); 

var pluginAssemblies = 
    from file in new DirectoryInfo(pluginDirectory).GetFiles() 
    where file.Extension == ".dll" 
    select Assembly.LoadFile(file.FullName); 

var gameTypes = 
    from dll in pluginAssemblies 
    from type in dll.GetExportedTypes() 
    where typeof(Game).IsAssignableFrom(type) 
    where !type.IsAbstract 
    where !type.IsGenericTypeDefinition 
    select type; 

如果使用依賴注入容器,可以通常容易在容器中註冊那些gameTypes。但是,無論如何,您可能需要某種工廠才能獲得正確的遊戲:

public interface IGameFactory 
{ 
    IEnumerable<Game> GetGames(); 

    Game GetGame(string name); 
} 
0

我認爲這是解決您的問題的一個非常穩固的方式。有沒有什麼特別的你不喜歡在數據庫中存儲類名?

+0

沒有任何東西!只要看看社區有什麼話要說。謝謝! – NickV