我想将类型IGameScoreSource
注入到一个类中,但是我很困惑如何处理它。
static class GamesScoreSourceFactory
{
public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType)
{
switch(gameScoreSourceType)
{
case FromFile:
return new GameScoreFile();
case FromDB:
return new DatabaseRepos();
case FromThirdPartyAPI:
return new ThirdPartyWrapper();
}
}
}
对于两种不同的情况,我有两个问题。
这三种情况都神奇地找出了从何处获取参数。因此,对于GameScoreFile
,它知道要查看的文件路径,对于DatabaseRepos
,它知道在哪里可以找到连接字符串。
大概,这些位置在具体的类中是硬编码的。但是,如果我想更改位置怎么办?
假设 scores.txt 是用GameScoreFile.cs
硬编码的,如果我想要rand_scores.txt
怎么办?
所以:
static class GamesScoreSourceFactory
{
public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType, string param)
{
switch(gameScoreSourceType)
{
case FromFile:
return new GameScoreFile(string param);
case FromDB:
return new DatabaseRepos(string param);
case FromThirdPartyAPI:
return new ThirdPartyWrapper(ThirdPartyConfig conf{IPAddress = ipAddress, Port = port});
}
}
}
前两种情况都很好,但第三种情况不是,因为它需要一个配置对象。
我必须创建另一个工厂类吗?但是调用代码不必知道要调用哪个Factory对象,结果本身就变成了Factory?
我不确定如何处理...如果重复,请链接我。
答案 0 :(得分:0)
理想情况下,您将以下类型作为对工厂类的依赖项注入
GameScoreFile
DatabaseRepos
ThirdPartyWrapper
这样,无论您使用哪种框架进行依赖性解析,都知道要为对应的类型传递什么。
答案 1 :(得分:0)
我将尝试隔离依赖项,以使工厂类不必了解太多。
比方说,您IGameScoreSource的每个具体实现都有自己的依赖性。在上面的示例中,两个需要一个字符串,而第三个需要ThirdPartyConfig。
这看起来并不多,但是随着您重新构造类,每次引入或更改依赖项时,工厂类也必须进行更改。不理想。
您可以为每种具体类型创建工厂,然后对其中一种实现的任何更改只会影响其自己的工厂。然后,主要工厂类将仅与这些特定工厂一起使用,而不受每次更改的影响。
正确的解决方案取决于您的域模型和所使用的IOC方法。