【问题标题】:Handling cross-cutting concerns like internal statistics reporting for components of a web application处理横切关注点,例如 Web 应用程序组件的内部统计报告
【发布时间】:2012-02-22 20:28:53
【问题描述】:

我正在尝试为 OLTP Web 应用程序的内部组件实现统计报告。例如,我想近乎实时地跟踪以下事物的使用或性能:成功/失败登录的数量、nhibernate 会话的数量、服务 HTTP 请求的时间、不同类型的交易数量(订单、访问等)。所有这些统计数据都通过 UDP 发送到 statsd 服务器 (https://github.com/etsy/statsd) 并使用 Graphite 绘制成图表。

应用程序正在使用依赖注入来连接内部组件。我想将统计报告集中在一个自己的类中,并将其隐藏在一个接口下。但是,我想在应用程序的每个组件中注入一个统计报告类/接口的实例,这些组件报告性能或使用数据是一种气味。在我看来,绩效报告事件应该是一个横切关注点,很像日志记录。

您如何处理此类请求的内部设计?您是否会使用构造函数注入、静态方法(例如 PerformanceCounters.Increment("name.of.counter"))(称为我的受监控组件)或如何处理?

如果对上下文有任何帮助,该应用程序是用 C# 完成的,并且使用 ASP.NET 和 Castle Windsor 作为 IoC。

谢谢, 罗伯特

【问题讨论】:

标签: c# design-patterns inversion-of-control performancecounter


【解决方案1】:

我使用 Spring.Net 来做类似的事情。据我所知,Spring 与 IoC 的 Castle Windsor 非常相似,Spring 使用 CastleWindsor 来创建动态代理。这些可以用于 Spring 支持的 AOP。学习曲线很短,框架有很好的文档记录。配置好性能方面后,将其应用于您的方法应该非常容易。如果您需要小样本,请告诉我。

【讨论】:

  • 问题不在于选择基于特性的 IoC 容器,而在于从架构的角度设计解决方案。无论如何,当使用 Spring.NET 处理请求时,代码是什么样的?
【解决方案2】:

我认为您所指的设计模式是Aspect Oriented Programming。 Castle Windsor 与大多数其他 IoC 容器一样支持 AOP。

正如您所说,您不会在每个组件中注入统计报告类/接口的实例。相反,在您的配置中,您使用拦截器包装每个组件。该组件对统计报告一无所知;在每次调用您的组件之前和之后都会调用拦截器,并且可以决定是否以及在何处发送跟踪信息。它非常适合记录、跟踪、性能计数、故障处理以及您提到的所有横切关注点。

【讨论】:

  • 我知道这是一个横切关注点,但它不像日志那样“包装”方法调用。使用 AOP 的拦截器/装饰器的方法来计算登录成功或失败似乎并不正确。例如,如果我在控制器操作 (ASP.NET MVC) 中处理登录逻辑,如何确定登录是否成功以增加正确的计数器?
  • @Robert 你正在使用的登录服务大概是返回一个值,设置一些状态,或者抛出一个异常来指示登录是否成功。在您的拦截器中,您只需在函数调用后检查此内容并采取相应措施。在我看来,这绝对是对拦截器的适当使用。而且,虽然拦截器对底层对象进行“包装”调用,但您显然不必在前后都做某事:在这种情况下,您的拦截器只会附加到调用中。
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 2014-07-05
  • 2012-02-19
  • 1970-01-01
  • 2018-12-28
  • 2016-07-26
  • 2021-10-31
  • 2017-08-05
相关资源
最近更新 更多