HomeController中對學生一個依賴,因爲它代表了一些責任Student類。實施
一種方法是:
public HomeController()
{
private Student _student;
public HomeController()
{
_student = new Student();
}
}
public class Student
{
// Some method
}
但隨後的HomeController對學生類硬依賴。如果你想使用學生的其他實現(例如想要在單元測試HomeController的時候模擬學生),該怎麼辦?你將不得不修改學生類或HomeController類(或使用其他一些不那麼好的選擇)。這意味着你的HomeController的是緊耦合到Student類。
另一種方法是你已經發布的代碼:
public class HomeController
{
private IStudent _student;
public HomeController(IStudent student)
{
_student = student;
}
}
public interface IStudent
{
// Some method
}
public class Student : IStudent
{
// Implementation of some method
}
在這裏,你可以通過在IStudent即任何實現在單元測試中,你可以通過IStudent的模擬對象,在實際代碼將傳遞Student類的對象。所以你HomeController現在是依賴在IStudent接口(抽象)而不是在學生類(一個實現)。 這符合OOP原則:
編程爲接口,而不是實現。
取決於抽象。不要依賴於具體的課程。
此外,它現在具有軟依賴性。它不再與Student類緊密結合。它是鬆耦合。 現在,通常您不需要擔心在實例化您的HomeController時應該通過哪個IStudent實現。這就是Depedency Injection Container(你的情況下的Unity)會照顧到的,只要你註冊了正確的接口和類。
_container.Register<IStudent, Student>();
因此,當需要一個新的HomeController實例時,容器將識別需要一個IStudent實例。因此它將實例化IStudent的註冊實例,並在實例化HomeController類時將其作爲參數傳遞。
此外,請注意您所指的是'依賴注入'(這是IoC的一種特定形式)。還有其他形式的IoC(例如回調,觀察者模式等)。
編輯: 不要忘了閱讀DI上的popular article。
這是[Dependency Injection](http://martinfowler.com/articles/injection.html)的[構造函數注入](http://martinfowler.com/articles/injection.html#injector.gif)風格。 – publicgk 2013-03-11 06:11:38