繁体   English   中英

在带有.NET MVC的大型CRUD视图中使用IoC和Repository Pattern

[英]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 ...

谢谢

您可以传递单个工作单元实例,而不是传递多个存储库。 诀窍是正确实现它,这里有一个:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net- MVC应用程序

(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM