C# 中的提供程序模型依赖项注入实现
本文关键字:依赖 注入 实现 模型 程序 | 更新日期: 2023-09-27 18:36:27
我有一个架构情况,我想征求意见。
我有一个我正在开发的扑克系统。 目前,我有许多不同类型的游戏目前由不同的类处理(当然有一个共同的界面)。
游戏包括德州扑克、奥马哈喜、奥马哈高/低、7 张牌梭哈、7 张牌拉兹、伦敦低球和跟随女王。 我希望将来会有更多。
目前,我使用的是提供程序模型,类似于 SQL 连接字符串。 交易是,游戏的所有类型名称都位于app.config文件中。
我正在考虑将类型放在数据库中,这样就不需要触摸配置文件。 然后,当我开发新游戏时,安装程序只需复制一个新的 DLL,就可以调用脚本以将游戏的类型插入数据库。
有没有更好的方法来动态允许这种类型的依赖关系?
也许您甚至可以在不需要更新数据库的情况下执行此操作。既然您将一个游戏放在一个 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);
}
我认为这是解决您问题的非常可靠的方法。在数据库中存储类名有什么您不喜欢的特定内容吗?