我正在开发一个使用 ASP.NET MVC3 和 SQL Server 中的数据库的 Web 应用程序项目。还有一个移动应用程序通过 REST 服务使用同一数据库中的数据。以下是我的应用程序的一些层:
模型 - ADO.NET 数据模型,使用 Entity Framework
数据访问层 - 具有从数据库中检索数据的查询的存储库
Web 应用程序 - MVC3 项目,使用存储库,使用 Structure Map 和 DI 松散耦合,数据库上下文在 HttpRequest 的末尾处理
Core - DAL 和服务层之间的另一层,使用存储库并将数据公开给服务层。某种业务逻辑层。
服务层 - REST 服务,了解核心层但不了解 DAL。将数据映射到 DTO 并向客户端公开
我遇到的此类应用程序架构的问题是服务层上的松散耦合。服务层引用了核心层。核心层引用了数据访问层并使用其存储库。虽然存储库没有默认构造函数。他们期望 1 个参数及其数据库对象上下文(一次性对象)。
直接在我的网站上使用存储库没有问题。我正在使用 Structure Map 和 DI 使其松散耦合。每个上下文都在 HttpRequest 的末尾处理。
问题出在Service层和Core层。我也想在那里有松耦合,但不确定如何实现它?如何将数据上下文注入(inject)其中并确保它在特定时刻得到处理?我想听听有关如何将它们组合在一起的一些建议。
最佳答案
Service Layer has reference to Core layer.
没关系。
Core layer has reference to Data Access Layer and uses its repositories.
那可不行。
您的“核心”应该是您的领域,具有业务规则和逻辑。它不应该有任何依赖关系。
从栈底开始:
- Repo - 不依赖于其他层。
- 服务 - 对 Core 和 Repo 的依赖。
- 核心 - 不依赖于其他层。
- Web - 依赖于一切。
我们就是这样做的。我们结合使用接口(interface)驱动编程和依赖注入(inject)来处理松散耦合。
示例流程:
- HTTP 请求传入(API、Web 层等)
- 找到 Controller 。 DI 容器发现容器依赖于
ISomethingService
并解决它,包括任何进一步的依赖性(服务、 repo 等)。 - Controller 调用
ISomethingService
上的方法。 ISomethingService
实现(由 DI 选择)调用ISomeRepo
上的方法。ISomeRepo
实现(由 DI 选择)调用 EF/DB,返回“数据对象”给服务。- 服务将“数据对象”映射到“核心”对象并返回给 Controller 。
这些对象的实例化应由您的 DI 容器处理。上面我们使用的唯一缺少的是“工作单元”,它基本上包装了 EF 上下文。
关于entity-framework - .NET REST 服务、 Entity Framework 和松耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6657740/