Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按名称获取服务_C#_Asp.net Core_Dependency Injection_Switch Statement - Fatal编程技术网

C# 按名称获取服务

C# 按名称获取服务,c#,asp.net-core,dependency-injection,switch-statement,C#,Asp.net Core,Dependency Injection,Switch Statement,我有一个.Net核心游戏项目。在任何API中,我都希望通过提供游戏名称(或Id)来获得特定于游戏的服务。我目前的情况如下: public GameServiceBase GetGameService(string gameName) { switch (gameName) { case GameNames.Keno: return new KenoService();

我有一个.Net核心游戏项目。在任何API中,我都希望通过提供游戏名称(或Id)来获得特定于游戏的服务。我目前的情况如下:

public GameServiceBase GetGameService(string gameName)
{
         switch (gameName)
         {
                case GameNames.Keno:
                    return new KenoService();
                case GameNames.BetOnPoker:
                    return new BetOnPokerService();
                case GameNames.Minesweeper:
                    return new MinesweeperService();
                default:
                    throw new Exception();
        }
}

假设我们有更多的游戏服务,我只列出了一些,但你明白了。有没有更好的方法来获取服务而不是使用switch语句?也许使用依赖注入是可能的,但我不知道怎么做。或者有某种设计模式可以这样做。

你可以拥有一个
游戏名的
字典
,Func

它将是这样的:

static Dictionary<GameNames,Func<GameServiceBase>>  dict = new Dictionary<GameNames,Func<GameServiceBase>>();

// can be in object creation
dict.Add(GameNames.Keno, () => new KenoService());
.
.
public GameServiceBase GetGameService(string gameName) 
{
    // handle here case of wrong game name
...

    return dict[gameName];
}

static Dictionary dict=new Dictionary();
//可以在对象创建中使用
dict.Add(GameNames.Keno,()=>newkenoservice());
.
.
公共GameServiceBase GetGameService(字符串gameName)
{
//在这里处理游戏名称错误的情况
...
返回dict[gameName];
}
其优点是,这种解决方案是动态的,而不是像交换机那样静态的。 这正是本文的重点


我使用了GameSerieBase的func,因为它与问题中的一样,函数在每次调用中都会返回一个新实例。

对于初学者,您可以使用
字典(假设您的所有游戏服务都实现了接口GameService),您的意思是使用IGameServiceBase作为func中的类型吗?它是函数的返回参数。在问题的代码中,每次调用都返回一个新实例。所以Func会给你同样的行为。