【发布时间】:2013-10-22 07:23:32
【问题描述】:
假设我有一个接口CrawlerInterface,实现PageCrawler 和FeedCrawler;如果我们碰巧在一个控制器中需要这两个类,那么如何通过构造函数注入来实现呢?
以前我们使用中心ServiceProvider 来注册(即App::bind)这样的类,但在大多数情况下,我们只有一个接口的实现,所以我们还没有遇到上述问题。
PS:我也想知道这个问题是否表明我们应该拆分控制器。
更新:
感谢cmets和回复,解释一下,说接口只有一个公共方法:crawl($uri),并且页面/feed爬虫都将它实现为given a resource identifier, return resource.
我的后续问题:
假设我们在calculator 场景中,加法、减法和乘法共享同一个接口Operation,它只有一个公共方法run,在某些时候我们仍然会遇到这个问题对吗?对于ServiceProvider,我们一般如何处理此类情况?
【问题讨论】:
-
正如一些人所指出的,这实际上可能是一种代码味道(我自己也遇到过这种味道!)。您能否包括为什么您选择使用接口来实现?您的 2 个实现之间有什么不同?正如 Antonio 所指出的,您实际上可能想要使用具体的类来实现依赖项,或者重新考虑一下代码架构。也许我们可以帮助解决使这个问题成为一个问题的底层架构。
-
@fideloper thx,认为我有解决问题的方法;但我仍然对我们能采取这种方法多远感到有些困惑,请参阅我的后续问题。
-
我真的认为一个接口有多个实现并不是一件坏事。但是,如果是这种情况并且您想同时使用许多实现,那么应该有一个基于它们的使用的原因。例如,我的应用程序中可能有 2 个缓存:一个用于查询,另一个用于我的视图。然后我对查询使用“APCCache”,对视图使用“FileCache”,但是正如你所看到的,我不关心实现,我只关心我有一个“cache.queries”和“cache.views” .重要的是用途。
-
@MatthieuNapoli 我想知道如何与服务提供商一起管理这个......
-
我不了解 Laravel,但通常 DI 容器提供“命名服务”的概念,即服务不是由类/接口名称标识而是由任意名称标识。我会从容器中请求“cache.queries”条目,而不是“Doctrine\Cache\CacheInterface”条目。
标签: php dependency-injection laravel laravel-4 simplepie