【问题标题】:.NET - divorcing layers.NET - 分离层
【发布时间】:2012-10-31 19:30:00
【问题描述】:

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

DataAccessLayer
BusinessLogicLayer
UserInterfaceLayer

我有两个问题。

  1. 您会如何处理所有三层共有的功能,例如将错误记录到文本文件中。 .NET 中不允许循环依赖。我相信最好的方法是创建一个名为 Utilities 的第四个项目。
  2. 您是否在所有项目中或仅在用户界面层中都有 .config 文件(将所有配置参数作为参数传递给 BLL 和 DLL 中的构造函数)

【问题讨论】:

  • 您能否更具体地描述您正在建模的解决方案的场景?
  • @Riccardo,谢谢。数据访问层和业务逻辑层可能会抛出异常,我想记录这些。我可以在用户界面层(用于数据访问层和业务逻辑层)中添加一个日志记录工具,或者为此创建一个实用程序项目。

标签: vb.net design-patterns n-tier-architecture 3-tier


【解决方案1】:

您会如何处理所有三层共有的功能,例如将错误记录到文本文件中。 .NET 中不允许循环依赖。我认为最好的方法是创建一个名为 Utilities 的第四个项目。

横切关注点通常以第四次组装结束。但在记录器案例中,只需使用开发人员习惯的现有框架之一。例如 nlog 或 log4net。

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

其他人建议使用依赖注入,它是减少耦合并因此提高可维护性的好方法。我在这里写过一篇文章:http://www.codeproject.com/Articles/386164/Get-injected-into-the-world-of-inverted-dependenci

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

我宁愿创建一个配置抽象。类似于IConfigurationRepository。那么配置存储在web.config还是其他地方都没有关系。

【讨论】:

  • 你能解释一下 DI 与这个问题有什么关系吗?我知道 DI 是将实例变量传递给构造函数的过程,但我不明白与问题的相关性(我遗漏了一些东西)。一旦我明白这一点,我会标记答案。谢谢。
  • @w0051977:DI 通常也意味着针对抽象进行编码。因此,每次你做某事时,你对应用程序的了解要少得多。它还使得随着应用程序的增长重构应用程序变得更加容易(只需重新配置容器,而不是使用重构代码的每个地方)
  • 你能举个例子吗?谢谢
  • 谢谢。我已经阅读了这篇文章。你是说 DI 有不同的项目吗?我仍然不明白与问题的相关性(我遗漏了一些东西)。谢谢。
  • 你能回答我上次评论中的问题吗?然后我会将您的答案标记为已接受的答案。
【解决方案2】:
  1. 拥有第四个项目是一种解决方案,另一种是将其放置在数据层中,并在业务层中提供允许 UI 层访问它们的方法。

  2. 您应该只将每个设置放在一个位置,因此 UI 层似乎是一个不错的位置。

【讨论】:

  • 如果我选择您的选项 1 将存在循环依赖,即 DAL 将访问 BLL,反之亦然。我是不是误会了什么?
  • @w0051977:是的,那你是误会了。业务层的方法只供UI层访问,数据层直接访问。
  • 业务层可以调用数据层。在您的回答中,数据层也将访问业务层。这不会引入循环依赖吗?
  • @w0051977:不,数据层不会调用业务层。
【解决方案3】:
  1. 您可以创建一个日志记录项目并将其添加到所有其他项目,但我认为您应该为每个项目添加一个记录器配置文件,因为您正在建模三层架构意味着首先建模逻辑上分离的三层,所以您应该能够分别开发和测试它们中的每一个。
  2. 如果您有特定的层配置设置(例如,一个或多个层停留在不同的服务器上以获得所需的强大性能约束),则为每一层使用不同的配置文件。如果您有相同的配置设置,您可以在用户界面中只使用一个配置文件,但请注意,如果您更改用户界面,您将不得不替换所有设置,我认为这可能是一个严重的问题。李>

【讨论】:

    【解决方案4】:
    1. 是的,创建另一个记录项目。我建议在新项目中使用Log4Net

    2. 我会将配置设置保留在顶层 - UI 层 - 并将任何必要的内容传递给其他层。

    你没有提到DI,我肯定会使用 DI - 这应该是一个优先事项。

    【讨论】:

    • 谢谢。你的意思是有一个 DI 项目?
    • 不,使用DI将您的数据访问层注入您的业务逻辑层。 DI 真正分离了层之间的依赖关系。
    • 应该是“不,不要为日志创建另一个项目,因为“日志”是使用 Log4Net 解决的问题”?
    • 不,我更愿意创建另一个记录项目。添加对该项目的 Log4Net 引用并使用 Log4Net 实现通用日志接口。因此,每当需要更改日志框架时,无需更改其他代码 - 只需使用新框架实现日志接口即可。
    • @JoeR:我从来没有在应用程序中切换过日志框架。任何这样做的人可能在选择记录仪之前都没有做功课。所以恕我直言,能够切换日志实现不是问题。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多