也许您甚至可以在不需要更新数据库的情况下做到这一点。既然您将一款游戏放在一个 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);
}