Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 模型与BLL之间的循环依赖关系_.net_Vb.net_Model_Data Access Layer_Circular Dependency - Fatal编程技术网

.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。如果它们是如此紧密的耦合为什么要把它们放在不同的组件中?有道理……我自己也一直在思考这些问题。