DDD 的基础结构和模型层/项目之间的循环依赖关系

本文关键字:之间 项目 循环 依赖 关系 模型 结构 DDD | 更新日期: 2023-09-27 18:31:19

我正在关注一本关于 C# 中的领域驱动模型的书。网。我在基础架构和域层之间有循环依赖关系(两者都是我的解决方案的类库项目,即"共享管理")。我想知道如何摆脱Visual Studio/C#.NET中的循环依赖问题。

  1. 模型对基础设施层的依赖性:当然,域层使用基础架构层,使得模型层中的对象依赖于(调用)基础架构层中的对象(例如,基础架构层中定义的存储库使用实现基础架构层中定义的IRepository<T>从域模型层访问,ICompanyRepository)。

  2. 基础结构对域模型类的依赖关系:但是,在基础结构层中,我的实体框架(实体工厂)需要实现IEntityFactory<T> T EntityBase(域模型层中的实体类,派生自基础设施层中的实体库;实体库是所有实体的基类)。

以下是基础设施层中的类(在"存储库"文件夹下):

using System.Text;
using System.Data;
using ShareManagement.Model.Company; // How to do this ??
ShareManagement.Infrastructure.EntityFactoryFramework;
namespace ShareManagement.Infrastructure.Repositories
{
    internal class CompanyFactory: IEntityFactory<Company> 
//Company is defined in Model Layer and derived from Abstract Base class "EntityBase"
//So, how to use "using ShareManagement.Model.Company" ?
    {
    }
}

DDD 的基础结构和模型层/项目之间的循环依赖关系

下面链接中显示的图像有两个程序集/项目(括在两个主要边界中),分别命名为基础结构层项目/程序集和模型层 Prject/Assembly。

从图中可以明显看出,它们都在形成循环依赖关系。http://screencast.com/t/lUGwetETXHF

以下链接描述了此问题的解决方案:http://screencast.com/t/acsLjq7Ubd

如果项目/程序集 A(在本例中为

模型)依赖于(引用)项目/程序集 B(在本例中为基础结构),并且程序集 B 的"部分"(如 Infrastructure.Repository 或 EntityFactory)依赖于项目/程序集 A(模型)中形成循环依赖项的(;需要引用)类,则按如下方式解析此依赖项:

为了理解起见,让我们将程序集 B 中的相关"代码部分"命名为 B-dep1;

  1. 使 B-dep1 成为独立于 B ShareManagement.Infrastructure.Repository 的程序集/项目。

  2. B-dep1 的新项目的名称应与项目 B 中的层名称相同,以便 B-dep1 仍然是程序集/项目 B 中的层/命名空间的一部分(我的意思是,它仍然是 ShareManagement.Infrastructure 命名空间的一部分)。

  3. 现在,B-dep1 的新项目"ShareManagement.Infrastructure.Repository"可以引用 A,而无需形成循环依赖关系。

了解如何:

B-dep1 的新项目,即"ShareManagement.Infrastructure.Repository"依赖于 A。 在 B 上,但 B 不依赖于(引用)新零件项目。

A 依赖于 B,但 B 不依赖于 B-dep1 的新项目,即"ShareManagement.Infrastructure.Repository" 而 ShareManagement.Infrastructure.Repository 项目仍然可以继续使用基础架构层的命名空间(和封装的代码),而不必添加对基础架构代码的引用,因为它们具有相同的命名空间(这就是为什么我在 B 项目中根据命名空间命名项目的原因)。Visual Studio 根据项目名称或文件夹名称自动创建命名空间。不同集合中的相同命名空间释放了程序集以相互引用,就像在本例中与基础结构层相关的命名空间一样。