我有一個名爲IRepository
的Data Repository接口。 BakerRepository
從中繼承了通用的CRUD方法。現在對於BakerRepository
,它可能有一些對自己來說很特殊的方法。例如,一種稱爲Bake
的方法。在C#中將父接口轉換爲子接口時,依賴注入模式的目的是否會丟失?
我正在使用Unity.Mvc作爲依賴項的容器。這是我最初是如何使用它的控制器,這是我從我前幾天看了教程中學:
private IRepository<Baker, int> _repository;
public BakersController(IRepository<Baker, int> repo)
{
_repository = repo;
}
容器將基本上給我BakerRepository
實施。但是,當我嘗試使用唯一的Bake
方法時,它會返回錯誤,因爲_repository
的類型爲IRepository<Baker, int>
,因此不知道Bake
方法。
所以,我想這個實現,而不是:
private BakerRepository _repository;
public BakersController(IRepository<Baker, int> repo)
{
_repository = repo as BakerRepository;
}
我不完全瞭解DI模式,我只使用它,因爲我學會了它作爲一個關於ASP數據倉庫教程的一部分.Net MVC。我讀了它,我認爲它實際上是一個很好的設計模式,所以我決定繼續使用它,儘管我沒有百分之百地獲得它。
現在我想知道如果我這樣做的實現,如果我的目的依賴注入無用。我不太瞭解DI模式,我在其他地方找不到確切的答案。
要使用IRepository執行Bake方法,您可以在IRepository中使用Reflection或定義一個類型爲Action的屬性。通過反射,如果存在方法並且可以直接執行「操作」,則可以調用方法。但是如果你知道你需要調用Bake方法,爲什麼你要通過'IRepository'? –
這個具體的問題與DI無關,而與一般的抽象無關。您正在使用接口(抽象)以便不與特定的實現(通常,爲了更簡單的單元測試和「swapability」)相聯繫。對我來說,聽起來更像是你希望'Bake()'方法成爲'Baker'的一部分,而不是'IRepository'(它應該只用持久性而不是邏輯來打擾自己)。 – haim770
我會說你不會失去DI的積極方面。 DI模式只是一種方法,用於將實現方面的控制從類內部轉換爲外部(您也可以這樣做),以便在不知道注入對象的類的實現的情況下更改實現。注入自動化的可能性是提供更好資源分配的另一個積極方面。 - 對不起有點慢打字;-) –