c# - 在带有 .NET MVC 的大型 CRUD View 中使用 IoC 和存储库模式

标签 c# asp.net-mvc-4 ninject

我有一个大 View ,其中有大约 7 个不同型号的下拉菜单...... 因此,在我的 Controller 的构造函数中,我有 9 个 IRepository,如下所示:

public CrudController(IRepository<Class1> class1Rep, IRepository<Class2> class2Rep,  ... 
IRepository<Class9> class9Rep)
{
    this.class1Rep = class1Rep;
   ...
    this.class9Rep = class9Rep;
}

所以,我可以用所有必要的数据填充我的 ViewModel...

这是正确的方法吗?我正在使用 Ninject...

谢谢

最佳答案

看起来违反了建议零售价。每个 View 模型是否都需要所有存储库?有些 ViewModel 只使用几个吗?您是否正在做其他复杂的工作来创建 ViewModel?如果是这样,我会抽象 ViewModel 构造的一般概念,并最好使用 Automapper 之类的东西来删除任何映射。

我们使用 IModelEnricher<T> 抽象填充选择列表和其他复杂工作的概念,其中 T 是 ViewModel。 IModelEnricher<T> 定义了一种 Enrich 方法,该方法采用 T ViewModel 的实例并返回实例 T。在 Enrich 方法中可以执行您需要执行的任何巧妙工作。如果您需要 ViewModel 的两个存储库,那么您只需将它们注入(inject) IModelEnricher<T> 的构造函数中

我们自动使用 IModelEnricher 来丰富从 Action 结果返回的 ViewModel。我们总是还会将域模型自动映射到同一管道中的 ViewModel。大多数 Get Controller 操作都是一行代码,因为 Automapper 处理将域模型转换为 ViewModel,而丰富器则执行任何其他操作。

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 关于下拉菜单的回答。

关于c# - 在带有 .NET MVC 的大型 CRUD View 中使用 IoC 和存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166257/

相关文章:

c# - 如何使用 ninject 将单个工厂实例注入(inject)多个存储库和工作单元?

c# - Ninject WithConstructorArgument : No matching bindings are available, 并且该类型不可自绑定(bind)

asp.net - 在 View 中使用 RenderPartial 时不显示 ValidationSummary()

c# - 将数据从 jQuery POST/GET 到 MVC 4 Controller 并返回 View 的最佳方法

c# - 这是不推荐使用的编码方式吗? ASP.Net MVC

c# - 如何使用CommandParameter发送列表

c# - 使用 Ninject 2.0 为 C# ASP.NET(非 MVC)注入(inject)依赖项

c# - 如何识别重叠日期范围的最大数量?

c# - 可以将 Excel 文档加载到内存中、填充并以字节形式返回吗?

c# - 如何将字符串数组转换为长数组?