.net 模型与BLL之间的循环依赖关系
假设一个架构就是这样.net 模型与BLL之间的循环依赖关系,.net,vb.net,model,data-access-layer,circular-dependency,.net,Vb.net,Model,Data Access Layer,Circular Dependency,假设一个架构就是这样 MODEL > BLL > DLL 试图在我的模型中实现延迟加载,我的模型和BLL之间遇到了循环依赖 基本上想象一下我想实现的模型中的一个属性,如下所示 Public Readonly Property ProjectCategory As ProjectCategory Get If Me._ProjectCategory Is Nothing Then Me._ProjectCategory = Projec
MODEL > BLL > DLL
试图在我的模型中实现延迟加载,我的模型和BLL之间遇到了循环依赖
基本上想象一下我想实现的模型中的一个属性,如下所示
Public Readonly Property ProjectCategory As ProjectCategory
Get
If Me._ProjectCategory Is Nothing Then
Me._ProjectCategory = ProjectCategoryBLL.GetProjectCategoryByID(Me._ProjectCategoryID)
End If
Return Me._ProjectCategory
End Get
End Property
我有我的模型,BLL和DLL在不同的项目中,由于我的BLL引用了我的模型,我不能从我的模型引用我的BLL,因为这将创建一个循环依赖
这个问题的典型解决方案是什么?看起来你把事情搞得一团糟,很可能是因为对层次和模式的理解有误
为什么您的BLL引用您的模型?它应该没有必要这样做。在经典的n层应用程序中,模型和BLL是一回事。如果随后为UI实现了一个模式(比如MVVM),那么模型可能仍然是BLL,或者可能是调用BLL的一段单独的代码(BLL对模型没有直接的了解)。在MVC中,模型处理数据,因此它再次与BLL对话(甚至可能是BLL的一部分)
我的建议是模型参考BLL,而不是相反。或者,您可以将模型集成到BLL中,具体取决于所构建内容的复杂性。您可以为模型项目中引用的BLL类创建接口,并使用factory模式或依赖项注入创建具体类。准备好给你的项目增加一些复杂性。另一种选择是查看ORMs。它们处理了很多延迟加载的属性,这些属性看起来是您试图实现的我不赞成您当前的体系结构。当然,将应用程序分层为逻辑层或物理层取决于您的项目需要和复杂性。但最好摆脱当前的实现,应用新的体系结构:
- 域模型:由域实体、存储库接口等组成
- 存储库:实现域模型中定义的存储库契约,可以有不同的存储库实现
- AppService:由
、视图模型
、消息
等组成。这将是用户进入整个系统的入口点应用程序服务
- 演示:将实现类似于
或MVP
模式的演示模式MVC
设计模式和最佳实践的优势越多,您就可以确保您的代码库具有更高的可伸缩性、松散耦合性和更好的可维护性
如果您正在开发一个产品,而不仅仅是为自己开发一个示例应用程序,我建议您深入研究领域驱动设计
、企业应用程序架构
和设计模式
,以便能够更好地建模您的业务需求,并实现更好、更健壮的架构
如果您需要更多信息或具体问题[:“为什么您的BLL引用了您的模型?它应该没有必要引用您的模型”,我们将很乐意对此进行更多讨论-Microsoft最佳实践n层示例:BLL引用模型mmmmkay…我不打算下载它只是为了检查,我相信你的话。但仅仅指出这一点并不能回答我的问题:为什么BLL需要引用模型?模型的工作是向BLL传递或封送数据,通常它们可以是相同的东西(相同的组件)。如果它们是分开的,那么BLL不应该知道到底是什么组件在使用它,它应该只做它的业务。对不起,不否认你的观点,并且肯定同意你所说的其余部分…但是正如你所指出的,在示例I link 2中,没有从模型中了解BLL。如果它们是如此紧密的耦合为什么要把它们放在不同的组件中?有道理……我自己也一直在思考这些问题。