0

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

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

  2. 基础设施对域模型类的依赖性:但是,在基础设施层中,我的实体框架(实体工厂)需要实现IEntityFactory<T>where Tis EntityBase(域模型层中的实体类从基础设施层中的 EntityBase 派生;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" ?
    {

    }
}
4

1 回答 1

0

下面链接中显示的图像有两个组件/项目(包含在两个主要边界中),分别命名为 Infrastructure Layer Project/Assembly 和 Model Layer Prject/Assembly。

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

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

如果项目/程序集 A(在我们的例子中是模型)依赖于(引用)项目/程序集 B(在我们的例子中是基础设施)并且如果“部分”程序集 B(如 Infrastructure.Repositories 或 EntityFactory)取决于 (;需要引用)项目/程序集A(模型)中的类形成循环依赖关系然后解决这个依赖关系如下:

为了便于理解,我们将程序集 B 中依赖的“代码部分”命名为 B-dep1,然后;

  1. 使 B-dep1 成为与 B ShareManagement.Infrastructure.Repositories 分开的程序集/项目。

  2. B-dep1 的新项目的名称应该与项目 B 中层的名称空间名称相同,这样 B-dep1 仍然是层/名称空间的一部分(我的意思是,它仍然是 ShareManagement.Infrastructure 名称空间的一部分)装配/项目 B.(在我们的例子中,我将 B-dep1 的这个新项目命名为 ShareManagement.Infrastructure.Repositories。

  3. 现在,B-dep1 的新项目,即“ShareManagement.Infrastructure.Repositories”可以引用 A 而不会形成循环依赖。

怎么看:

B-dep1 的新项目,即“ShareManagement.Infrastructure.Repositories”依赖于 A. on B,但 B 不依赖于(参考)New-Part 项目。

A 依赖于 B 但 B 不依赖于 B-dep1 的新项目,即“ShareManagement.Infrastructure.Repositories”,而 ShareManagement.Infrastructure.Repositories 项目仍然可以继续使用基础设施层的命名空间(和封装代码),而无需添加引用基础设施代码,因为它们具有相同的名称空间(这就是为什么我将项目命名为 B 项目中的名称空间)。Visual Studio 根据项目名称或文件夹名称自动创建命名空间。不同组件中的相同命名空间释放了组件以相互引用,就像在这种情况下与基础设施层相关的命名空间一样。

于 2013-09-19T07:28:19.910 回答