我正在关注C#中的域驱动模型书.NEt。我在基础设施和域层之间具有循环依赖性(两者都是我的解决方案的类库项目,即“ShareManagement”)。我想知道如何摆脱Visual Studio / C#.NET中的循环依赖问题。
模型对基础设施层的依赖性: 当然,域层使用基础架构层,使得模型层中的对象依赖于(调用)基础架构层中的对象(如基础架构层中定义的存储库,使用ICompanyRepository从域模型层访问,ICompanyRepository实现在基础架构层中定义的IRepository)。
基础设施对域模型类的依赖性: 但是,在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" ?
{
}
}
答案 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,然后;
使B-dep1成为B ShareManagement.Infrastructure.Repositories的独立装配/项目。
新项目B-dep1的名称应该与项目B中的图层名称相同,因此B-dep1仍然是图层/名称空间的一部分(我的意思是,它仍然是在Assembly / Project B中的ShareManagement.Infrastructure命名空间。(在我们的例子中,我将这个B-dep1的新项目命名为ShareManagement.Infrastructure.Repositories。
现在,B-dep1的新项目即“ShareManagement.Infrastructure.Repositories”可以引用A而不形成循环依赖。
参见如何:
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相关的名称空间一样。