1

我有一个建筑情况,我想得到一个意见。

我有一个正在开发的扑克系统。目前我有许多不同类型的游戏目前由不同的类处理(当然有一个通用的接口)。

游戏包括德州扑克、Omaha Hi、Omaha Hi/Lo、7-Card Stud、7-Card razz、London Lowball 和 Follow the Queen。我希望将来会有更多。

目前,我使用的是提供者模型,类似于 SQL 连接字符串。交易是,所有游戏的类型名称都位于 app.config 文件中。

我正在考虑将类型放入数据库中,这样就不需要触及配置文件。然后当我开发一个新游戏时,安装程​​序只需复制一个新的 DLL 并调用一个脚本来将游戏的类型插入数据库中。

有没有更好的方法来动态允许这种类型的依赖?

4

2 回答 2

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);
}
于 2012-06-07T20:33:27.623 回答
0

我认为这是解决您的问题的一种非常可靠的方法。关于在数据库中存储类名,您有什么特别不喜欢的吗?

于 2012-06-07T18:30:09.873 回答