看起来违反了 SRP。每个视图模型都需要所有存储库吗?有些 ViewModel 只使用一对吗?您是否正在做其他复杂的工作来创建 ViewModel?如果是这样,我将抽象 ViewModel 构造的一般概念,并理想地使用 Automapper 之类的东西来删除任何映射。
我们使用IModelEnricher<T>
其中 T 是 ViewModel 来抽象填充选择列表和其他复杂工作的概念。IModelEnricher<T>
定义了一个方法 Enrich,它接受 T ViewModel 的一个实例并返回一个实例 T。在 Enrich 方法中做任何你需要做的聪明的工作。如果您需要 ViewModel 的两个存储库,那么您只需将它们注入到您的构造函数中IModelEnricher<T>
我们自动使用 IModelEnricher 来丰富从我们的操作结果返回的 ViewModel。我们总是将我们的域模型自动映射到同一管道中的 ViewModel。大多数 Get 控制器操作都是一行代码,因为 Automapper 处理将域模型转换为 ViewModel 并且丰富器执行任何其他操作。
retrun AutoMappedView<AConcreteViewModel>(repository.Find(id))
如果找到一个实现 IModelEnricher 的类,AConcreteViewModel
它将被调用并完成任何工作,例如
public class AConcreteViewModelEnricher:IModelEnricher<AConcreteViewModel>{
AConcreteViewModelEnricher(Repo1 repo1, Reop2 rep2){
........
}
AConcreteViewModel Enrich(AConcreteViewModel model){
//Do stuff with repo etc and
return model
}
}
请参阅我对您关于下拉菜单的其他问题的回答。