我有一個自定義框架,我有一個類/方法使用我自己的Cache
類。使用自定義提供者類去除緊密耦合
目前它緊密耦合。因此,一個方法實例化Cache
類是這樣的:
public function someMethod ()
{
$cache = new Cache\HHCache();
}
我想RO刪除緊耦合,但是這其實這裏我有點卡住了。
我認爲這是一個好主意,創建某種ServiceProvider
類。但我不確定這是否是正確的方法。
要開始我有HHConfig
文件,其中有一個static
屬性,其中定義了緩存類。總之:
class HHConfig
{
static $_cacheClass = '\Core\Cache\HHCache';
}
所以基本上我有這樣一類,這是我的框架核心部分功能:
interface IHHServiceProvider
{
public function getService ();
}
然後,我有另一個類,將實現該interface
。
class HHCacheProvider implements IHHServiceProvider
{
public static function getService ()
{
$class = HHConfig::$_cacheClass;
return new $class();
}
}
所以現在someMethod
可以使用HHCacheProvider
類來獲得一個Cache
類的一個實例。
public function someMethod ()
{
$cache = HHCacheProvider::getService ();
}
我IHHServiceProvider
是不是真的像典型Provider
類,因爲你不能真正註冊任何Services
它。它只是在HHConfig
類看起來什麼「類」加載和返回的例子。
所以不知何故,這種方法並不適合我,但我確實認爲它顯示了我想達到的目標。我可以通過哪些方式改善這一點?
請注意,我不是在尋找這個簡單的依賴注入模式。因爲我不想將我的Cache
類注入到每個構造函數類中。我需要一個非緊密耦合的以某種方式從方法中獲取HHCache
類的實例的方法。
某些可以成爲我框架一部分的提供者類似乎是正確的方向。
爲什麼*不*只是注入了'CacheFactory'?無論你做什麼,都不涉及注射,你不會減少耦合,你只是將耦合轉移到其他關係。 – DaveRandom 2013-04-10 13:15:55
@DaveRandom是的,我意識到這一點,但只要它可以是一個泛型類,它是我的框架的「核心」的一部分,那麼它並沒有那麼糟糕。我希望開發人員能夠用自己的實現「覆蓋」默認的'HHCache'類。使用DI當然是減少耦合的最佳方式。但我真的更像一個'提供者'模式。 - 這樣一個「開發人員」可以簡單地改變'HHConfig'中的'HHCache'類,並指定要使用什麼'Cache'類。作爲回報的Cache類必須實現一個保證它具有所需要的方法的接口。 – w00 2013-04-10 13:22:54
ServiceProvider實際上是某種單身人士和單身人士是邪惡的:http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/所以我強烈推薦DI或至少一個工廠方法,也許在一個普通的基類或其他東西。 – 2013-04-10 14:15:52