實現類:
復制代碼 代碼如下:
<?php
class Container
{
protected $setings = array();
public function set($abstract, $concrete = null)
{
if ($concrete === null) {
$concrete = $abstract;
}
$this->setings[$abstract] = $concrete;
}
public function get($abstract, $parameters = array())
{
if (!isset($this->setings[$abstract])) {
return null;
}
return $this->build($this->setings[$abstract], $parameters);
}
public function build($concrete, $parameters)
{
if ($concrete instanceof Closure) {
return $concrete($this, $parameters);
}
$reflector = new ReflectionClass($concrete);
if (!$reflector->isInstantiable()) {
throw new Exception("Class {$concrete} is not instantiable");
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return $reflector->newInstance();
}
$parameters = $constructor->getParameters();
$dependencies = $this->getDependencies($parameters);
return $reflector->newInstanceArgs($dependencies);
}
public function getDependencies($parameters)
{
$dependencies = array();
foreach ($parameters as $parameter) {
$dependency = $parameter->getClass();
if ($dependency === null) {
if ($parameter->isDefaultValueAvailable()) {
$dependencies[] = $parameter->getDefaultValue();
} else {
throw new Exception("Can not be resolve class dependency {$parameter->name}");
}
} else {
$dependencies[] = $this->get($dependency->name);
}
}
return $dependencies;
}
}
實現實例:
復制代碼 代碼如下:
<?php
require 'container.php';
interface MyInterface{}
class Foo implements MyInterface{}
class Bar implements MyInterface{}
class Baz
{
public function __construct(MyInterface $foo)
{
$this->foo = $foo;
}
}
$container = new Container();
$container->set('Baz', 'Baz');
$container->set('MyInterface', 'Foo');
$baz = $container->get('Baz');
print_r($baz);
$container->set('MyInterface', 'Bar');
$baz = $container->get('Baz');
print_r($baz);
依賴注入和控制反轉是同義詞,已合並。控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題。 控制反轉還有一個名字叫做依賴注入(Dependency Injection)。簡稱DI。
起源
早在2004年,Martin Fowler就提出了“哪些方面的控制被反轉了?”這個問題。他總結出是依賴對象的獲得被反轉了。基於這個結論,他為創造了控制反轉一個更好的名字:依賴注入。許多非凡的應用(比HelloWorld.java更加優美,更加復雜)都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個對象都需要,與其合作的對象(也就是它所依賴的對象)的引用。如果這個獲取過程要靠自身實現,那麼如你所見,這將導致代碼高度耦合並且難以測試。 IoC 亦稱為 “依賴倒置原理”("Dependency Inversion Principle")。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,這可說是IoC原理的一項應用。SmallTalk,C++, Java 或各種.NET 語言等面向對象程序語言的程序員已使用了這些原理。 控制反轉是Spring框架的核心。 應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關於一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
編輯本段IoC是設計模式
IoC就是IoC,不是什麼技術,與GoF一樣,是一種設計模式。 Interface Driven Design接口驅動,接口驅動有很多好處,可以提供不同靈活的子類實現,增加代碼穩定和健壯性等等,但是接口一定是需要實現的,也就是如下語句遲早要執行:AInterface a = new AInterfaceImp(); 這樣一來,耦合關系就產生了,如: Class A { AInterface a; A() { } aMethod() { a = new AInterfaceImp(); } } ClassA與AInterfaceImp就是依賴關系,如果想使用AInterface的另外一個實現就需要更改代碼了。當然我們可以建立一個Factory來根據條件生成想要的AInterface的具體實現,即: InterfaceImplFactory { AInterface create(Object condition) { if(condition = condA) { return new AInterfaceImpA(); } elseif(condition = condB) { return new AInterfaceImpB(); } else { return new AInterfaceImp(); } } } 表面上是在一定程度上緩解了以上問題,但實質上這種代碼耦合並沒有改變。通過IoC模式可以徹底解決這種耦合,它把耦合從代碼中移出去,放到統一的XML 文件中,通過一個容器在需要的時候把這個依賴關系形成,即把需要的接口實現注入到需要它的類中,這可能就是“依賴注入”說法的來源了。 IOC模式,系統中通過引入實現了IOC模式的IOC容器,即可由IOC容器來管理對象的生命周期、依賴關系等,從而使得應用程序的配置和......余下全文>>
國內 cnblog 51cto csdn
國外
www.asp.net
www.codeproject.com
www.codeplex.com
至於開源項目,51aspx哪能輪得到
大名鼎鼎的Nunit, Json.net, log4net, lucene.net, paint.net, mono多了去了,看看下面的列表
1.[TEST] xUnit.net - 用於TDD的最好的測試框架之一。
2.[TEST] RhinoMocks mocking framework - 通過創建mock使測試更簡單。
3.[TEST] White for automation of Windows applications - 用代碼驅動Windows程序來測試。
4.[TEST] Gallio Automation Platform - 可以運行很多測試框架,如MSTest、xUnit、NUnit以及MbUnit。
5.[DATA] Fluent NHibernate - Fluent NHibernate讓你可以用C#代碼來設置映射關系。
6.[OOP] StructureMap Dependency Injection/Inversion of Control - 解耦類和依賴。
7.[OOP] Managed Extensibility Framework - 從靜態編譯程序轉換到動態語言程序
8.[APPFX] s#arp architecture for web applications - 用ASP.NET MVC和NHibernate快速開發web應用程序。
9.[APPFX] OpenRasta REST based framework for building web applications - 讓你的程序擁有一個REST API接口。
10.[APPFX] CSLA.NET Application Framework - .NET開發綜合框架
11.[APPFX] Spring.NET Application Framework - Web開發綜合框架
12.[RUNTIME] Mono enables .NET on Linux and Mac - 在Linux、BSD和OS X上使用.NET.
13.[UTIL] Sandcastle Help File Builder - 創建MSDN樣式的文檔。
14.[HELPER] EasyHook for Windows API Hooking - 用托管代碼擴展非托管代碼。
15.[HELPER] Json.NET for working with JSON formatted data - 用一條語句序列化.NET對象。
16.[HELPER] Excel Data Reader for Excel 97 to 2007 - ......余下全文>>