【发布时间】:2021-12-17 20:18:26
【问题描述】:
看看那个伪代码
class A,B,C implements StrategyInterface
{
private dep;
constructor(Dep dep) {
this->dep = dep;
}
}
class StrategyResolver
{
private locator;
constructor(ServiceLocator locator) {
this->locator = locator;
}
public function resolve(data): StrategyInterface
{
if ( xxx ) {
return locator->get(A);
} else if ( yyy ) {
return locator->get(B);
}
return locator->get(C);
}
}
由于服务定位器被认为是反模式,在这种情况下如何避免它? A,B,C 可以有各种依赖关系,这就是为什么我想使用依赖注入的所有好处来实例化它。我可以注入 A,B,C 作为 StrategyResolver 的依赖项,但如果我有 10 种策略怎么办。 StrategyResolver 依赖列表太长了。
【问题讨论】:
-
symfony(用于 PHP)有一个 DI 系统,它允许命名服务并传递一个数组作为类的输入,一个一个地声明列表中的项目。 Docs symfony.com/doc/current/components/dependency_injection.html 让我知道这是否可以解决问题,然后我可能会用一个完整的工作示例来写答案
标签: java php design-patterns strategy-pattern service-locator