在 Class 库中使用 API 接口,在 API 接口中使用 Class 库?

Using API Interface in Class Library, and the Class Library in API Interface?

我的项目看起来像这样:

Solution 
|-> Continent.Data (Class Library)
      ContinentRepository.cs
   
|-> ContinentsApi (WebApi)
      ContinentController.cs
      IContinentRepository.cs
      Continent.cs

我的问题是我需要 ContinentsApi 才能使用 Continent.Data,但还需要 Continent.Data 才能使用 ContinentsApi。

I can't implement the IContinentRepository or use the Continent class in the Class Library ContinentRepository

如果我理解正确的话,你实际上是想这样做:

public class ContinentRepository : IContinentRepository
{
    public Continent GetById(int id) {}
}

但您无法访问,因为您的 class 图书馆无法访问 ContinentIContinentRepository。这可以通过从您的 class 库中引用您的 API 项目来解决。但是,有一个问题。为了能够使用您的 ContinentRepository,您需要能够在您的 API 项目中构建它的实例或使用 DI 容器注册实现。要解决这个问题,API 项目需要引用 class 库才能访问 ContinentRepository,因此我们遇到了真正的问题:循环引用。

您尝试做的是可能的,但您缺少的部分是您的 Domain 项目 - 另一个 class 库,不应引用您的任何其他项目解决方案。这是您定义接口和业务逻辑的地方。在您的示例中,ContinentIContinentRepository 都是您域的一部分,因此它们应该存在于您的 Domain 项目中。解决方案结构如下所示:

 Solution 
 |-> Continent.Data (Class Library)
       ContinentRepository.cs
 |
 |
\|/ (Continent.Data references Domain)

 |-> Contintent.Domain (Class Library)
       IContinentRepository.cs
       Continent.cs

/|\  (ContinentsApi references Domain)
 |
 |
 |-> ContinentsApi (WebApi)
       ContinentController.cs

这里 ContinentsApi 被认为是您的解决方案 composition root 创建依赖关系图的地方。应该只有一个复合根。因此,ContinentsApi 也会引用 Continent.Data,这样您就可以在 Continent.Data 项目中构造或注册 DI 容器实现您的实现。

Domain 项目消除了循环引用问题,从而解决了您的问题。

要添加对其他项目的引用:

  • Right-click 您要添加引用的项目
  • 前往 Add -> Project Reference...
  • 选中您要引用的项目旁边的复选框
  • 点击OK

或者,如果您在 .NET Core 项目中 right-click 上 Dependencies 或在 .NET Framework 项目中 References 上执行此操作,则两者都可以在您的解决方案的项目下找到。这是您可以在 .NET Core 项目中找到它的图片: