2013-03-25 58 views
1

我正试图围绕IoC容器包装头部。随着我深入探究这种设计模式,在我简单地实例化一个数据上下文类之前,我会遇到许多抽象层,接口和具体类,然后使用它,然后处理它。如何在MVC Web应用程序中使用E.F实现IoC容器

虽然我很想继续前进,但仍有一些突出的问题,我不知道如何解决,希望得到一些澄清和指导。

  1. 在具有2个项目(MVC幅&数据层 含有EF)的通用web应用程序,如果我们的扶养解析器期望的存储库 实现特定接口(允许我们在任何时间切换 库未来),界面 在哪里定义?我没有看到它是如何在mvc web项目中定义的,因为那么数据访问层将依赖于它,并且它不能驻留在数据访问层中,因为mvc项目取决于dal,而且我错过了整个点这个练习。那么 的答案是在两个项目中定义它,并让每个项目 引用它自己的副本?这甚至可能吗?或者我需要 创建第三个服务层项目并在其中粘贴一个界面 声明,并让这两个项目都引用它?

  2. 我看过一些文章谈到团结IoC和 接口,如IProductRepository,IClientRepository和 IProductService,IClientService(这就是我指的是在 我的首段)。我是否正确地假设这些 实例中的每一个都应该在我的数据库中引用一个表?如果是的话 如果我有50张桌子会发生什么?我是否需要创建50个存储库 接口和50个表相关的接口来解耦所有内容? 如何使用EF与POCO类影响事物?我需要 每个POCO都实现它自己的指定接口吗?

感谢

+0

不要将逻辑层(表示,数据,业务)与物理层(mvc项目/程序集,数据)混淆。一个应用程序可以在一个物理组件中,并且仍然在逻辑上分层结构,不会直接与彼此进行对话,在必要时注入组件。 – Maarten 2016-04-28 10:18:23

回答

0

理想情况下,你将你的解决方案分成几个项目。

您将拥有一个定义了接口的合同项目,这是实现这些接口的具体版本的dal。

您的mvc项目会引用合同项目来处理对类型的引用。

您将使用IOC容器扫描bin文件夹中的程序集,并找到控制器相关性的具体实现。这意味着你会将你的dal建立到你的mvc项目的bin文件夹中。这意味着你可以简单地通过在bin文件夹中放置一个新的dll来切换其他实现。

至于仓库和表格,我倾向于按业务功能对它们进行分组。因此,管理用户及其相关表格的业务功能将位于用户存储库等中,但这归功于个人偏好imo。

0

当你把你的项目分成多个层时,你是正确的,不希望你的数据层依赖于栈上的项目。一般而言,你希望这些依赖是单向的。您可以继续执行您正在做的事情并将接口放入数据层,也可以创建一个新的项目来存放模型代码,包括存储库和服务接口。你的数据层将取决于模型代码,你的mvc层将取决于数据层。

要解决您的第二个问题,我会说这是设计艺术的地方。您不一定需要在您的实体和数据表之间进行一对一的映射。如果它是有意义的,并且您认为它是可管理的,特别是在Entity Framework的帮助下,那么继续进行一对一映射。但请记住,持久层和领域模型层的职责是不同的。如果持久层开始堵塞创建领域模型的工作,那么现在是时候将一些工作分离出来。

更重要的是将要暴露于mvc项目的界面“外墙”。这些将需要一定程度的与模型和持久层的解耦。应该将它们归结为模型的核心责任。你不想让你的领域模型错综复杂的应用层。

+0

为什么MVC层依赖于数据层?如果你是因为除了在bin输出文件夹中获取已编译的程序集之外的任何其他原因而这么做的话,那么你是出于错误的原因这么做的。 – Maarten 2016-04-28 10:20:26

相关问题