在 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 图书馆无法访问 Continent
或 IContinentRepository
。这可以通过从您的 class 库中引用您的 API 项目来解决。但是,有一个问题。为了能够使用您的 ContinentRepository
,您需要能够在您的 API 项目中构建它的实例或使用 DI 容器注册实现。要解决这个问题,API 项目需要引用 class 库才能访问 ContinentRepository
,因此我们遇到了真正的问题:循环引用。
您尝试做的是可能的,但您缺少的部分是您的 Domain
项目 - 另一个 class 库,不应引用您的任何其他项目解决方案。这是您定义接口和业务逻辑的地方。在您的示例中,Continent
和 IContinentRepository
都是您域的一部分,因此它们应该存在于您的 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 项目中找到它的图片:
我的项目看起来像这样:
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 图书馆无法访问 Continent
或 IContinentRepository
。这可以通过从您的 class 库中引用您的 API 项目来解决。但是,有一个问题。为了能够使用您的 ContinentRepository
,您需要能够在您的 API 项目中构建它的实例或使用 DI 容器注册实现。要解决这个问题,API 项目需要引用 class 库才能访问 ContinentRepository
,因此我们遇到了真正的问题:循环引用。
您尝试做的是可能的,但您缺少的部分是您的 Domain
项目 - 另一个 class 库,不应引用您的任何其他项目解决方案。这是您定义接口和业务逻辑的地方。在您的示例中,Continent
和 IContinentRepository
都是您域的一部分,因此它们应该存在于您的 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 项目中找到它的图片: