我有一个三层应用程序(演示文稿,业务逻辑和数据访问)。在数据访问层中,我有一个名为Unit
的对象,我在业务层中有另一个名为Unit
的对象。
在业务层中的Insert()
对象上调用Unit
时,它会在数据访问层中的相应对象上调用Insert()
方法,并将自身作为参数传递。我遇到的问题是数据访问层没有引用业务层,允许它这样做会导致循环依赖。
我的方法有缺陷吗?如果是这样,那么什么是我的问题的一个很好的解决方案?
答案 0 :(得分:2)
当你说你正在做的方式需要层之间的双向依赖时,你是对的,这几乎总是一件坏事。这种依赖的原因是您的业务逻辑层承担了持久层的一些责任(通过在业务逻辑层中实现Insert()
)。
似乎你在这里混合了两个不兼容的概念。
首先,您声明代码中有三个层:表示,业务和数据访问。此声明的问题在于您还声称使用active record类似模式(unit.Insert()
)。如果您确实拥有独特的域(业务)层和持久性(数据访问)层,那么域对象将不知道如何Insert()
。
看看repository pattern。此模式更适合建立不同的持久层。如果使用此模式,则可以在持久层中定义“实体”,并将域层中的Unit
对象映射到持久层中的Unit
对象。 AutoMapper可以避免手动将域模型映射到实体的痛苦。