3

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

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

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

  • Web 应用程序- MVC3 项目,使用存储库,使用结构映射和 DI 松散耦合,数据库上下文在 HttpRequest 结束时被释放

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

  • 服务层- REST 服务,了解核心层但不了解 DAL。将数据映射到 DTO 并暴露给客户端

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

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

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

4

2 回答 2

5

服务层参考核心层。

没关系。

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

那不好。

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

从栈底开始:

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

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

示例流程:

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

这些对象的实例化应该由您的 DI 容器处理。上面我们使用的唯一缺少的是“工作单元”,它基本上包装了 EF 上下文。

于 2011-07-11T23:49:36.737 回答
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
    }
}

注意:UnitOfWork 理想情况下是按 HttpContext 创建的。即,您的数据上下文将在开始请求时开始其生命,并将在最后处理。每个请求您将只使用一个。

于 2011-07-11T23:33:01.470 回答