C# 按名称获取服务
我有一个.Net核心游戏项目。在任何API中,我都希望通过提供游戏名称(或Id)来获得特定于游戏的服务。我目前的情况如下: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();
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会给你同样的行为。