Vb.net .NET-离婚层

Vb.net .NET-离婚层,vb.net,design-patterns,n-tier-architecture,3-tier,Vb.net,Design Patterns,N Tier Architecture,3 Tier,我正在尝试为正在开发的大型.NET应用程序创建一个结构。我计划创建三个项目: DataAccessLayer BusinessLogicLayer UserInterfaceLayer 我有两个问题 您将如何处理这三个层共有的功能,例如将错误记录到文本文件。在.NET中不允许循环依赖项。我认为最好的方法是创建一个名为Utilities的第四个项目 您是在所有项目中都有.config文件,还是仅在用户界面层(将所有配置参数作为参数传递给BLL和DLL中的构造函数) 拥有第四个项目是一种解决方案,

我正在尝试为正在开发的大型.NET应用程序创建一个结构。我计划创建三个项目:

DataAccessLayer
BusinessLogicLayer
UserInterfaceLayer
我有两个问题

  • 您将如何处理这三个层共有的功能,例如将错误记录到文本文件。在.NET中不允许循环依赖项。我认为最好的方法是创建一个名为Utilities的第四个项目
  • 您是在所有项目中都有.config文件,还是仅在用户界面层(将所有配置参数作为参数传递给BLL和DLL中的构造函数)
  • 拥有第四个项目是一种解决方案,另一种是将其放在数据层,并在业务层中拥有允许UI层访问它们的方法

  • 每个设置应该只在一个地方,因此UI层似乎是一个好地方

  • 是,创建另一个用于日志记录的项目。我建议在新项目中使用

  • 我会将配置设置保持在顶层(UI层),并将任何必要的内容向下传递到其他层

  • 你不用说,我肯定会使用DI——这应该是优先考虑的

  • 您可以创建一个日志项目并将其添加到所有其他项目中,但在我看来,您应该为每个项目添加一个日志配置文件,因为在进行建模时要对三层体系结构进行建模,这意味着首先要对逻辑上分离的三层进行建模,以便能够分别开发和测试它们
  • 如果您有特定的层配置设置(例如,一个或多个层保留在不同的服务器上以获得所需的强性能约束),请为每个层使用不同的配置文件。如果您具有相同的配置设置,则只能在用户界面中使用一个配置文件,但请注意,如果更改用户界面,则必须替换所有设置,我认为这可能是一个严重的问题
  • 您将如何处理这三个层共有的功能,例如将错误记录到文本文件。在.NET中不允许循环依赖项。我认为最好的方法是创建一个名为Utilities的第四个项目

    横切关注点通常以第四个组件结束。但是在logger的例子中,只需使用开发人员常用的现有框架之一。例如nlog或log4net

    循环依赖是一种气味(高耦合或低内聚),任何地方都不允许循环依赖

    还有人建议使用依赖注入,这是一种减少耦合从而提高可维护性的好方法。我在这里写了一篇文章:

    您是在所有项目中都有.config文件,还是仅在用户界面层(将所有配置参数作为参数传递给BLL和DLL中的构造函数)


    我宁愿创建一个配置抽象。类似于
    IConfigurationRepository
    。那么,配置是否存储在web.config或其他地方就无关紧要了。

    您能更具体地描述一下您正在建模的解决方案的场景吗?@Riccardo,谢谢。dataaccesslayer和businesslogic层可能抛出异常,我想记录这些异常。我可以在用户界面层(dataaccesslayer和businesslogiclayer)中添加一个日志功能,或者为此创建一个实用程序项目。谢谢。你的意思是有一个DI项目吗?不,使用DI将数据访问层注入到业务逻辑层中。DI确实分离了层之间的依赖关系。如果是“不,不要创建另一个日志项目,因为使用Log4Net“日志”是一个已解决的问题”?不,我更喜欢创建另一个日志项目。向该项目添加一个Log4Net引用,并使用Log4Net实现一个通用日志接口。因此,每当需要更改日志框架时,不需要更改其他代码—只需使用新框架实现日志接口即可。@JoeR:我从未在应用程序中切换过日志框架。任何这样做的人在选择记录器之前可能都没有完成作业。因此,imho能够切换日志记录实现是一个不成问题的问题。如果我选择您的选项1,将存在循环依赖性,即DAL将访问BLL,反之亦然。我是不是误会了什么?@w0051977:是的,那你是误会了什么。业务层中的方法只能由UI层访问,数据层直接访问,业务层可以调用数据层。在您的回答中,数据层也将访问业务层。这不会引入循环依赖性吗?@w0051977:不,数据层不会调用业务层。你能解释一下DI与这个问题有什么关联吗?我理解DI是将实例变量传递给构造函数的过程,但我不理解与这个问题的相关性(我遗漏了一些东西)。一旦我明白了这一点,我会记下答案。谢谢。@w0051977:DI通常也表示根据抽象进行编码。因此,每次做某件事时,您对应用程序的了解就要少得多。它还使应用程序在增长时更容易重构(只需重新配置容器,而不是使用重构代码的每个地方),您能提供一个示例吗?谢谢,谢谢。我读过这篇文章。你是说对DI有一个不同的项目吗?我仍然不明白这个问题的相关性(我遗漏了一些东西)。谢谢。你能回答我上次评论中的问题吗?然后,我会将你的答案标记为已接受的答案。