2

我有一个大视图,大约有 7 个下拉菜单到不同的模型......所以,在我的控制器的构造函数中,我有 9 个 IRepository,就像这样:

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

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

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

谢谢

4

3 回答 3

1

一个简单的答案是简单地创建一个包含所有存储库的包装类,然后您只需要传递包装类。

然而,大多数纯粹主义者会说,如果你有这么多的存储库,你可能违反了单一职责原则,应该将功能分解到其他类中。

于 2013-10-03T19:45:45.960 回答
1

看起来违反了 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
    }
}

请参阅我对您关于下拉菜单的其他问题的回答。

于 2013-10-08T19:45:17.713 回答
1

您无需传递多个存储库,而是传递一个工作单元的单个实例。诀窍是正确实现它,这是一个:

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 接口和多个实现。例如,一个 Entity Framework 工作单元具有注入的内容,以便它可以将上下文向下传递到存储库。内存中的工作单元可以具有其他依赖项等。

最终,您的 IoC 容器只是解析了工作单元。

于 2013-10-03T19:33:52.097 回答