.NET REST服务,实体框架和松散耦合

Neb*_*ron 3 rest datacontext service entity-framework loose-coupling

我正在使用ASP.NET MVC3和SQL Server中的数据库开发Web应用程序项目.还有一个移动应用程序通过REST服务使用来自同一数据库的数据.以下是我的应用程序的一些层:

  • Model - ADO.NET数据模型,使用Entity Framework

  • 数据访问层 - 具有查询以从数据库中检索数据的存储库

  • Web应用程序 - MVC3项目,使用存储库,使用Structure Map和DI进行松散耦合,数据库上下文在HttpRequest结束时处理

  • 核心 - DAL和服务层之间的另一层,使用存储库并将数据公开给服务层.业务逻辑层的排序.

  • 服务层 - REST服务,了解Core层但不了解DAL.将数据映射到DTO并公开给客户端

我在这种应用程序架构中遇到的问题是服务层上的松散耦合.服务层引用了Core层.核心层引用了数据访问层并使用其存储库.但是,存储库没有默认构造函数.他们期望1个参数及其数据库对象上下文(一次性对象).

直接在我的网站上使用存储库不是问题.我正在使用结构图和DI使它松散耦合.每个上下文都在HttpRequest的末尾处理.

问题是服务层和核心层.我想在那里松耦合,但不知道如何实现它?如何将数据上下文注入其中并确保在某个时刻处置?我想听听一些关于如何将它们放在一起的建议.

RPM*_*984 5

服务层引用了Core层.

没关系.

核心层引用了数据访问层并使用其存储库.

那不好.

您的"核心"应该是您的域名,具有业务规则和逻辑.它不应该有任何依赖.

从堆栈的底部开始:

  1. 回购 - 不依赖于其他层.
  2. 服务 - 依赖核心和回购.
  3. 核心 - 不依赖于其他层.
  4. 网络 - 依赖于一切.

这是我们的做法.我们使用接口驱动编程和依赖注入的组合来处理松散耦合.

示例流程:

  1. HTTP请求进来(API,Web层等)
  2. 找到控制器.DI容器看到容器依赖ISomethingService并解析它,包括任何进一步的依赖关系(服务,repo等).
  3. 控制器调用方法ISomethingService.
  4. ISomethingService实现(由DI选择)调用方法ISomeRepo.
  5. ISomeRepo 实现(由DI选择)调用EF/DB,将"data-object"返回给服务.
  6. 服务将"数据对象"映射到"核心"对象并返回到控制器.

这些对象的实例化应由您的DI容器处理.我们使用的上述唯一缺少的是"工作单元",它基本上包含了EF上下文.