[英]Using IoC with Repository Pattern in a large CRUD view with .NET MVC
我有一個大視圖,有大約7個下拉到不同的模型...所以,在我的控制器的構造函數中,我有9個IRepository,就像這樣:
public CrudController(IRepository<Class1> class1Rep, IRepository<Class2> class2Rep, ...
IRepository<Class9> class9Rep)
{
this.class1Rep = class1Rep;
...
this.class9Rep = class9Rep;
}
所以,我可以使用所有必要的數據填充我的ViewModel ...
這是正確的方法嗎? 我正在使用Ninject ...
謝謝
您可以傳遞單個工作單元實例,而不是傳遞多個存儲庫。 訣竅是正確實現它,這里有一個:
(UoW部分在最后的某處開始)
仍然缺少的是你有一個uow接口和多個實現。 例如,實體框架工作單元具有注入的內容,以便它可以將上下文傳遞到存儲庫。 內存工作單元可以具有其他依賴性等。
最終,您的IoC容器只能解析工作單元。
一個簡單的答案是簡單地創建一個包含所有存儲庫的包裝類,然后只需要傳遞包裝類。
但是,大多數純粹主義者會說,如果你有那么多的存儲庫,你可能違反了單一責任原則,並且應該將功能分解為其他類。
看起來違反了SRP。 每個View Model是否需要所有存儲庫? 一些ViewModels只使用一對嗎? 你在做其他復雜的工作來創建ViewModel嗎? 如果是這樣,我將抽象ViewModel構造的一般概念,並理想地使用類似Automapper的東西來刪除任何映射。
我們使用IModelEnricher<T>
抽象填充選擇列表和其他復雜工作的概念,其中T是ViewModel。 IModelEnricher<T>
定義了一個Enrich方法,它接受T ViewModel的一個實例並返回一個實例T.在Enrich方法中,你需要做任何聰明的工作。 如果你需要一個ViewModel的兩個存儲庫,那么你只是將它們注入你的IModelEnricher<T>
的構造函數中
我們自動使用IModelEnricher來豐富從Action結果返回的ViewModels。 我們總是將域模型自動化到同一管道中的ViewModel。 大多數Get控制器操作都是單行代碼,因為Automapper處理將Domain Model轉換為ViewModel並且richher會執行任何其他操作。
retrun AutoMappedView<AConcreteViewModel>(repository.Find(id))
如果發現了一類implemeting IModelEnricher AConcreteViewModel
它會被調用,完成工作,如
public class AConcreteViewModelEnricher:IModelEnricher<AConcreteViewModel>{
AConcreteViewModelEnricher(Repo1 repo1, Reop2 rep2){
........
}
AConcreteViewModel Enrich(AConcreteViewModel model){
//Do stuff with repo etc and
return model
}
}
請參閱我對您關於跌落的其他問題的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.