【问题标题】:How to introduce application-wide context object?如何引入应用范围的上下文对象?
【发布时间】:2015-08-14 04:44:47
【问题描述】:

我需要从应用程序的业务层访问几个属性。这些是一些 id 和常用设置。它们中的大多数仅在请求-响应生命周期内有效。
这是一个设置了依赖注入的 Web 应用程序(具体来说是 ASP.NET Web 窗体)。

目前,这些属性通过方法参数直接传递给业务层的服务。这可行,但效率不高,因为:

  • 有时需要更深入地传递参数的值,从而有点模糊可读性
  • 某些属性应该被延迟解析,并且每个请求只应该执行一次
  • 检索通过触摸数据库解决的属性可能会让新开发人员感到困惑(没有统一的方法)
  • 一些服务是由工厂构建的,工厂通过一些配置参数丰富了它们

我正在考虑引入一个应用程序上下文接口,并在主项目中实现一个实现,该实现将在每个请求时创建。它可以直接注入到服务中,使它们自动和独立地参数化(服务不再需要工厂)。

是应该如何解决这个问题,还是有其他选择?
我不喜欢这里的一个选项是它可能会将主粒子与业务层结合起来,这不是The Clean Architecture 的完美示例。

【问题讨论】:

    标签: asp.net .net architecture


    【解决方案1】:

    我说您的解决方案是一个非常常见的解决方案 - 将“应用程序上下文”注入您的类。我要注意的一件事是确保您遵循集成隔离原则(来自 SOLID)。不要只是开始让所有类都期望一个应用程序上下文实例。相反,设计接口将应用程序上下文分开,并让您的类期望它们作为依赖项。然后,您的应用程序上下文将需要实现所有接口。

    这是做事的正确方法,因为它将您的类与实现分离。实际上,您的类并不关心它们的依赖项是否来自一个巨大的应用程序上下文,它们只关心由它实现的特定方法。这将使您的代码更加健壮,因为如果您稍后更改应用程序上下文的实现,您将降低破坏某些东西的风险。

    【讨论】:

      【解决方案2】:

      你为什么不使用一些依赖注入容器?您的全局设置和参数可以作为伪单例注册到其中,然后您就可以从应用程序中的任何位置巧妙地请求它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-14
        • 2013-07-14
        • 1970-01-01
        • 2010-10-11
        • 2018-12-31
        • 1970-01-01
        • 2019-04-06
        • 2017-06-05
        相关资源
        最近更新 更多