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

时间:2013-09-15 13:36:16

标签: c# model dependencies infrastructure cyclic

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

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

  2. 基础设施对域模型类的依赖性: 但是,在Infrastructure Layer中,我的实体框架(Entity Factory)需要实现IEntityFactory,其中T是EntityBase(域模型层中的实体类派生自InfrasBase in Infrascture Layer; EntityBase是所有实体的基类)。

    < / LI>

    //以下是infrasture层中的类(在“Repositories”文件夹下)

    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" ?
        {
    
    
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

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

此问题的解决方案如下面的链接所示: http://screencast.com/t/acsLjq7Ubd

如果项目/程序集A(在我们的例子中是模型)依赖于(引用)项目/程序集B(在我们的例子中是基础结构),如果“part-of”程序集B(如, Infrastructure.Repositories OR EntityFactory)依赖于(;需要引用)Project / Assembly A(Model)中的类,形成循环依赖,然后解决此依赖关系,如下所示:

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

  1. 使B-dep1成为B ShareManagement.Infrastructure.Repositories的独立装配/项目。

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

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

  4. 参见如何:

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

    A取决于B但B不依赖于B-dep1的新项目,即“ShareManagement.Infrastructure.Repositories”  而ShareManagement.Infrastructure.Repositories项目仍然可以继续使用Infrastructure Layer的命名空间(和封装代码),而不必添加对Infrastructure Code的引用,因为它们具有相同的命名空间(这就是为什么我在B Project中按命名空间命名项目) 。 Visual Studio根据项目名称或文件夹名称自动创建名称空间。不同程序集中的相同名称空间释放程序集以相互引用,就像在这种情况下与Infrascture Layer相关的名称空间一样。

相关问题