2011-09-01 100 views
0

假设一个架构如此。MODEL和BLL之间的循环依赖关系

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,因为这会创建一个循环依赖项。

这个问题的典型解决方案是什么?

+0

如果他们是如此紧密地在不同的组件加上为什么让他们? –

+0

有效的观点......自己一直在思考这些问题。 –

回答

1

它看起来像你有可怕的混合起来的事情,最有可能是由于层次和模式的混合了解。

为什么你的BLL引用你的模型?它应该没有必要。在经典的n层应用程序中,模型和BLL是同一件事。如果你继续为你的UI实现一个模式(比如MVVM),那么这个模型可能仍然是BLL,或者它可能是一个单独的代码,它调用BLL(并且BLL没有直接了解模型) 。在MVC中,模型处理数据,因此它再次与BLL交谈(或者甚至可能被集成并且是BLL的一部分)。

我的建议是模型引用BLL,但不是相反。或者,您可以将模型整合到BLL中,具体取决于您正在构建的复杂性。

+0

“为什么您的BLL引用您的模型?它应该没有必要” - Microsoft最佳实践n层示例:http://download.microsoft.com/download/8/0/1/801ff297-aea6-46b9-8e11 -810df5df1032/Microsoft%20.NET%20Pet%20Shop%204.0.msi BLL参考模型 –

+0

Mmmmkay ....我不打算下载,只是为了检查,我会接受你的话。但仅仅指出这一点并不能回答我的问题:*为什么BLL **需要**来引用模型?*模型的工作是将数据传入或传出BLL,并且他们经常可以是相同的东西(相同的组件)。如果他们是分开的,那么BLL应该不知道使用它的组件是什么,它应该只是做它的生意。 – slugster

+0

对不起,不排除你的观点,绝对同意你所说的其他内容......然而,正如你指出的那样,在链接2的例子中,没有关于模型中BLL的知识。 –

0

您可以为您的Model项目中引用的bll类创建接口,并使用工厂模式或使用依赖注入创建具体类。只是准备给你的项目增加一些复杂性。另一种方法是查看ORM。他们照顾很多懒惰加载的属性,看起来像你试图实现

0

我不赞成你当前的架构。当然,将应用程序分层为逻辑或物理层取决于您的项目需求和复杂性。但是这将是一个更好的主意来摆脱当前的实施和应用新的架构,例如:

  • 域模型:由你的域实体,接口为您的存储库等
  • 存储库:实现在域模型中定义的存储库协定,您可以有不同的存储库实现。
  • AppService:由View Models,Messages,Application Services等组成。这将成为用户进入整个系统的切入点。
  • 演示文稿:将执行一个演示模式,如MVPMVC模式。

这将是分层应用程序的通用架构。尝试针对接口而不是具体实现进行编程。此外,您抽象业务组件(应用程序层)的次数越多,利用使用Design Patterns和最佳实践的优势的次数越多,确保您的代码库将更具可伸缩性,松散耦合性和更好的可维护性。

如果你正在开发一个产品,而不只是示例应用程序为你自己,我建议你挖得更深一些,到Domain-Driven DesignEnterprise Application ArchitecturesDesign Patterns到能够模拟自己的业务需求,并实现更好,更稳健建筑。如果您需要了解更多信息或具体问题

将很乐意谈论这个[: