C# 中的提供程序模型依赖项注入实现

本文关键字:依赖 注入 实现 模型 程序 | 更新日期: 2023-09-27 18:36:27

我有一个架构情况,我想征求意见。

有一个我正在开发的扑克系统。 目前,我有许多不同类型的游戏目前由不同的类处理(当然有一个共同的界面)。

游戏包括德州扑克、奥马哈喜、奥马哈高/低、7 张牌梭哈、7 张牌拉兹、伦敦低球和跟随女王。 我希望将来会有更多。

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

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

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

C# 中的提供程序模型依赖项注入实现

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

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