首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有服务层和存储库层的ASP.NET MVC,接口应该在哪里定义?

带有服务层和存储库层的ASP.NET MVC,接口应该在哪里定义?
EN

Stack Overflow用户
提问于 2013-11-07 06:53:00
回答 1查看 12.2K关注 0票数 17

我正在为一个包含存储库层和服务层的.NET MVC应用程序确定一个相当简单的分层体系结构。我已经找到了一些相当清晰和简单的例子,特别是www.asp.net,以及这里的一些问题和答案,但我正在寻找一些更简单的东西,适合于小型应用程序,但使用不同的项目,以使人理解。我链接到上面的示例将存储库和服务作为Models命名空间中的类。对于我来说,这还不足以清楚地说明这一点。

对于实现接口IRepository的存储库,我有一个单独的项目。服务有一个独立的项目,它实现IService并接受IRepository (构造器注入)。该服务实现IService。对于这个示例,控制器实例化服务就足够了,还不需要IoC容器。可以将其视为理解最佳架构实践的中间步骤,是逐步构建以包括依赖注入和可能更多层的序列的一部分。

问题是,我应该在哪里定义IRepository和IService?当然,服务和存储库项目都需要引用它们。因此,很明显,它们应该在服务和存储库项目引用的另一个项目中定义。如果是这样,那么一个好的命名约定是什么?像XXXXContracts这样的?

同样,对于在表示层、服务层和存储库层之间传递的数据模型,是否可以接受所有层都引用一个名为XXXXModels的单独项目?我知道在某些情况下,在服务层和存储库层之间传递的模型可能与在服务层和表示层之间传递的模型不同,但原理是相同的。

我在这里找到了类似问题的答案,但它们往往涉及比我在这里概述的更复杂的架构。我希望实现一个非常简单和清晰的两层说明,可以看作是上面的一两个步骤,引用数据层并在控制器中具有业务逻辑,仅此而已。我知道有一个强有力的、有效的论据支持直接使用成熟的最佳实践,但并不是每个人都适合一下子实现这种跳跃。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-07 08:31:40

引言

这也是我问过自己的问题。我总是有一个迫切的问题和你的类似;

一个好的命名约定是什么?

我该如何命名呢?它们应该放在文件夹还是项目中?

在四处搜索之后,我怀疑答案是这真的无关紧要。重要的是,您的解决方案具有一些合理的体系结构,并且您尝试遵循良好的实践,如SOLID

在这个话题上,我的ASP.NET MVC英雄是Jeffrey PalermoSteve SmithJimmy Bogard

洋葱架构

Jeffrey Palermo讨论了旧想法的组合,但将它们结合在一起,并给它起了一个视觉刺激的名字Onion Architecture (推荐阅读)。Jeffrey展示了一个很好的方法来解决把东西放在哪里的问题。他解释说,在你的应用程序的中心(或顶部),你有你的核心。这一层是您应该放置IRepositoryIService等接口的位置。

几乎所有的接口都应该放在核心中,其他所有东西(其他项目)都可以引用核心。这样,所有东西都知道应用程序的框架结构,而不需要知道实现细节。

尽量少引用UI层(在合理范围内)。在我的一个应用程序中,我的UI (MVC)层只引用了Core。它所需要的一切都是通过Dependency Injection注入的。

Steve Smith用MVC Solution Best Practices: A solution to the solution problem演示讨论了洋葱架构和类似的想法

我的解决方案

在我的MVC解决方案中,我有一个典型的结构,像这样:

  • MyProject.Core
  • MyProject.Domain
  • MyProject.DependencyInjection
  • MyProject.Infrastructure
  • MyProject.Web
  • MyProject.Tests

核心包含我的接口。它通常被划分为服务、模型、域、存储库等文件夹。

层仅引用核心并包含我的实现。它为核心中的领域抽象提供了许多具体的类。它处理大量的业务逻辑、处理、命令处理、管理器类、具体的服务实现等等。我认为它是一个相当内部的层,所以它引用的尽可能少。

DependencyInjection层包含我选择的DI包/框架和实现细节。我认为它是一个外层;类似于UI或Infrastructure,所以如果它引用了很多东西也没问题。这一层没有必要是一个单独的项目,很多人会告诉你不要这样做。这没问题;做适合你项目复杂性的事情吧。我喜欢我的DI是它自己的东西。它如此独立的好处是,我可以用一个不同的DI框架替换它,一切都会好起来的。没有层引用DI项目。

Infrastructure层包含有关日志记录、电子邮件和数据访问的信息。它将包含我选择的ORM。它不是业务逻辑的东西,也不是UI的东西。把事情做好是我解决方案的关键。它位于外层,但它只引用了Core。

MVCWebMVC层是我的项目,它只引用

复杂性和最终想法

我在这里找到了类似问题的答案,但它们往往涉及比我在这里概述的更复杂的体系结构

这是一个很好的观点。记住问题的复杂性是很重要的。但不要被好的解决方案实践吓倒。我的解决方案和洋葱架构不一定非常复杂,也不会让你的解决方案膨胀。他们只是把事情分开。

Evolutionary Project Structure中,Jimmy Bogard谈到了事情过于复杂。如果我所说的内容看起来太复杂,请听从Jimmy的建议,并将其全部放入一个项目(您的UI层)中。那没问题--只要它适合你。

记住,我的解决方案只是一个想法--需要考虑的东西;我的方法是试图遵循最好的智者的建议,但我相信我只成功了这么多;我仍然可以(也必须)改进。

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19824550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档