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

时间:2011-07-11 23:06:31

标签: entity-framework rest service datacontext loose-coupling

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

  • 模型 - 使用实体框架的ADO.NET数据模型

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

  

服务层引用了核心层。

没关系。

  

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

这不太好。

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

从堆栈底部开始:

  1. 回购 - 不依赖其他图层。
  2. 服务 - 依赖Core和Repo。
  3. 核心 - 不依赖于其他层。
  4. 网络 - 依赖于一切。
  5. 这就是我们这样做的方式。我们使用接口驱动编程和依赖注入的组合来处理松散耦合。

    示例流程:

    1. HTTP请求(API,Web层等)
    2. 找到控制器。 DI容器看到容器依赖ISomethingService并解析它,包括任何进一步的依赖关系(服务,回购等)。
    3. ISomethingService上的控制器调用方法。
    4. ISomethingService实施(由DI选择)调用ISomeRepo上的方法。
    5. ISomeRepo实现(由DI选择)调用EF / DB,返回“data-object”进行服务。
    6. 服务将“data-object”映射到“Core”对象并返回到控制器。
    7. 这些对象的实例化应由您的DI容器处理。我们使用的上述唯一缺少的是“工作单元”,它基本上包含了EF上下文。

答案 1 :(得分:1)

public ServiceLayerClass()
{
    private ICoreLayerClass coreLayerClass;

    public ServiceLayerClass(ICoreLayerClass coreLayerClass)
    {
        this.coreLayerClass = coreLayerClass;
    }

    public void DoSomeWork()
    {
        coreLayerClass.DoSomeWork();
    }
}

public CoreLayerClass()
{
    private ISomeRepository someRepository;

    public CoreLayerClass(ISomeRepository someRepository)
    {
        someRepository = this.someRepository;
    }

    public void DoSomeWork()
    {
        someRepository.DoSomeWork();
    }
}

public SomeRepository()
{
    public SomeRepository(IUnitOfWork uow)
    {
    }

    public void DoSomeWork()
    {
        //do some work
    }
}

注意: 理想情况下,每个HttpContext都会创建UnitOfWork。也就是说,您的datacontext将在开始请求时开始其生命,并将在最后处置。每个请求只能使用一个。