【发布时间】:2013-09-19 17:12:49
【问题描述】:
我正在关注 C#.NEt 中的域驱动模型一书。我在基础架构和域层之间存在循环依赖关系(两者都是我的解决方案的类库项目,即“ShareManagement”)。我想知道如何摆脱 Visual Studio/C#.NET 中的循环依赖问题。
-
模型对基础设施层的依赖: 当然,域层使用基础设施层,这样模型层中的对象依赖(调用)基础设施层中的对象(如基础设施层中定义的存储库使用
ICompanyRepository从域模型层访问,它实现了基础设施层中定义的IRepository<T>)。 -
基础设施对领域模型类的依赖: 但是,在基础设施层中,我的实体框架(实体工厂)需要实现
IEntityFactory<T>,其中T是EntityBase(域模型层中的实体类派生自基础设施层中的EntityBase;EntityBase 是所有实体的基类) .
以下是基础设施层中的类(在“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" ?
{
}
}
【问题讨论】:
-
严格来说,域不应依赖于任何基础设施或应用程序级服务。也许,onion architecture 的文章会是一个很好的参考。
-
你怎么能说当域模型层包含实体类时,所有这些实体类都派生自一个公共基类“EntityBase”,该基类在 InfraStructure Layer 中定义,据我所知,“使用 myProjectName.基础设施.DomainBase;"在域模型层中,我们必须将域模型层项目中的引用/依赖添加到基础设施层。请参阅下面的代码,其中我需要使用命名空间( using System; using SmartCA.Infrastructure.DomainBase; using SmartCA.Model.Companies; namespace SmartCA.Model.Projects { public class Contract : EntityBase {
-
再次,严格地说,实体不应该派生自基类(除非您正在建模需要继承的关系)。你也看过我链接的文章吗?
-
EntityBase:Evans 将 Entity 定义为“通过身份而不是属性来区分的对象”(Evans,Domain-Driven Design:Tackling Complexity in the Heart of Software,92),所有的实体类需要某种类型的数据类型来区分它们的身份。最好使用 Fowler 的分层超类型模式,该模式被定义为“充当其层中所有类型的超类型的类型”(Fowler,企业应用程序架构模式,475 ).让所有实体都继承自实体基类类型将有助于消除域实体类中的一些重复属性和行为。
-
除了我上面的解释:我的问题不在于模型是否应该使用/依赖于基础设施,或者实体是否应该从 EntityBase 派生。我的问题实际上是如何在基础设施层中使用模型层/项目中的命名空间(我是 Visual Studio 和 .NET 的新手,所以我尝试在基础设施层项目中创建对模型层的依赖项/引用,但因为模型层已经有了引用基础设施层,因此存在循环依赖问题。我不知道如何解决这种情况。
标签: c# model infrastructure cyclic-dependency