我有一个很大的观点,大约有7个下降到不同的模型...... 所以,在我的控制器构造函数中,我有9个IRepository,就像那样:
public CrudController(IRepository<Class1> class1Rep, IRepository<Class2> class2Rep, ...
IRepository<Class9> class9Rep)
{
this.class1Rep = class1Rep;
...
this.class9Rep = class9Rep;
}
所以,我可以使用所有必要的数据填充我的ViewModel ......
这是正确的方法吗?我正在使用Ninject ......
由于
答案 0 :(得分:1)
您可以传递单个工作单元实例,而不是传递多个存储库。诀窍是正确实现它,这里有一个:
(UoW部分在最后的某处开始)
仍然缺少的是你有一个uow接口和多个实现。例如,实体框架工作单元具有注入的内容,以便它可以将上下文传递到存储库。一个内存工作单元可以有其他依赖等。
最终,您的IoC容器只能解析工作单元。
答案 1 :(得分:1)
一个简单的答案是简单地创建一个包含所有存储库的包装类,然后只需要传递包装类。
但是,大多数纯粹主义者会说,如果你有那么多的存储库,你可能违反了单一责任原则,并且应该将功能分解为其他类。
答案 2 :(得分:1)
看起来违反了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))
如果为AConcreteViewModel
找到了实现IModelEnricher的类,则会调用它并完成任何工作,例如。
public class AConcreteViewModelEnricher:IModelEnricher<AConcreteViewModel>{
AConcreteViewModelEnricher(Repo1 repo1, Reop2 rep2){
........
}
AConcreteViewModel Enrich(AConcreteViewModel model){
//Do stuff with repo etc and
return model
}
}
请参阅我对other question关于下拉菜单的回答。