问题标签 [cross-cutting-concerns]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
110 浏览

architecture - 命名空间组织 - AOP 验证器

我已经开始在我们的开发框架中使用方面进行参数验证。它工作得很好,而且我喜欢不用验证代码乱扔公共方法的前半部分。

我想知道是否有人对您将在命名空间结构中放置参数验证的位置有任何建议?我的一部分认为,既然它是顶级功能,它应该在顶级产品命名空间中——很像 System 在 .NET Framework 中的使用方式。我只是担心核心程序集会随着更多这样的功能而膨胀,因为它会进一步发展。

就目前而言,我将它们放在以下位置:

[公司].[产品].ParameterValidators

在此示例中,ParameterValidators 是包含该功能的类(方面)的名称。

除此之外,如果有人对将方面合并到现有代码库中与结构布局相关的进一步建议,我将不胜感激。

0 投票
2 回答
187 浏览

language-agnostic - 应用程序框架——购买、构建还是同化?

我很好奇其他商店在基本应用程序框架方面做了什么?我将应用程序框架视为能够提供附加或扩展功能以提高由它构建的应用程序的质量。

有多种开箱即用的框架,例如 Spring(或 Spring.NET)等。我发现这些框架最大的问题是它们不是点菜的。基本上,它们有太多的功能,除非每个功能都是可用的最佳实现,否则您最终可能会使用多个框架的拼凑来完成这些任务 - 导致臃肿和混乱。在我看来,这适用于免费和商业系统。

当然,写作在很大程度上是在重新发明轮子。不过,我不认为它没有优点,因为它提供了最可定制的选项。但是,有些东西太大而无法开发,并且在这种情况下似乎实施得不好或根本没有实施,因为对承诺开发的前期成本犹豫不决。

有各种各样的开源项目也可以解决可能的应用程序框架的各个部分。这些可以被采用或吸收(显然取决于许可协议)以帮助构建来自不同来源的综合框架。

我们通过查看整个企业的应用程序中的一些更大的关注点来处理这种情况,并提出了一个有效的横切关注点和反复出现的实施问题的列表。最后,我们提出了部分开源、部分基于现有开源选项和部分定制开发的混合解决方案。

我们框架中的一些例子:

  • 异常和事件日志提供程序。一种简单、统一的方法,每个应用程序都可以通过这种方法以相同的方式记录异常和事件,而代码工作量最少。开箱即用,它可以记录到 SQL Server、文本文件、事件查看器等。它还包含用于记录到其他源的扩展点。
  • 变量赋值强制。一个泛型类,它基于对象类型公开扩展方法,使用受 JUnit 启发的语法。例如,要确定 myObject 是否不为空,我们可以做一个简单的 Enforce.That(myObject).IsNotNull(); 或通过执行简单的 Enforce.That(myObject).IsOfType(typeof(Hashtable)); 来确定它是否是特定类型 执行失败会引发适当的异常,既减少了代码量又提供了实现的一致性。
  • 单元测试助手。一系列基于反射的类,可以自动测试类及其属性。(受 CodePlex 的Automatic Class Tester启发)但从头开始编写。有助于为传统上难以测试或耗时的事物简化单元测试的创建。

我们还直接采用了其他一些功能。例如,我们将PostSharp用于 AOP,moq用于模拟,autofaq用于 DI。

只是想知道其他人可能做了什么,以及您的框架解决了哪些问题,您没有找到您满意的工具?至于我们的经验,我们肯定会从新框架中获益,并对我们采取的方法感到满意。

0 投票
7 回答
13830 浏览

web-services - groovy 是否提供包含机制?

我们正在为 groovy 脚本寻找一种包含机制,以便为横切关注点留出空间。

在我的示例中,我们将 Web 服务端点作为 groovy 脚本并希望登录到我们的 Web 服务协议。为此,我们使用隐式对象(从我们的框架中获取)来创建日志记录语句。

但如果我们在每个 Web 服务端点中编写代码,这就是样板代码。

我们正在 php 中搜索 include() 之类的东西,其中包括其他 groovy 脚本,有什么想法可以做到这一点吗?

0 投票
2 回答
2662 浏览

c# - C#属性修改方法

全部。也许我没有足够的谷歌搜索,但我找不到关于这个问题的任何例子。

可以在 C# 中创建一个自定义属性,该属性应用于一个类,修改其所有方法?例如,添加Console.WriteLine("Hello, i'm modified method");为第一行(或者如果它在运行时完成,则相当于 IL)?

0 投票
1 回答
375 浏览

cross-cutting-concerns - 重构:横切关注点解决方法

是否有一种解决方法可以在不涉及方面和切点等的情况下实现横切关注点?

我们在 Spring MVC 中,并且正在开发一个业务应用程序,由于各种原因,进入 AspectJ 或 Spring 的方面处理是不可行的。

我们的一些控制器已经变得非常臃肿(太重了),到处都是大量的失焦代码。

每次我坐下来重构时,我都会看到同样的事情一遍又一遍地做。请允许我解释一下:

每次我必须准备一个视图时,我都会为 UI 添加一个国家列表。(对象添加到 ModelAndView)。该列表从数据库中提取到 ehCache 中。

现在,最初当我试图将列表 INLINE 添加到 mav 的任何地方时,这很糟糕。相反,我准备了一个函数来处理每个 ModelAndView。如何?好吧,对函数有更多的垃圾调用!

我买了一个麻烦为另一个。

什么是可以帮助我的设计模式/技巧?我厌倦了调用函数来向我的 ModelAndView 添加东西,并且只有超过 3500 行的控制器代码,我要疯狂地找到所有东西丢失的粘合点!

欢迎提出建议。横切关注没有 AspectJ 或 Spring 原生的风味。

0 投票
2 回答
245 浏览

asp.net-mvc-2 - asp.net MVC 2 - 隔离保护代码的最优雅方式 - 防止空控制器参数

我有一个非常简单的问题,但我正在寻找以下问题的“最佳”解决方案:

我有多个控制器操作,如下所示:

隔离这种横切关注点的最佳方法是什么?

  • 我可以做一个功能
  • 我可以使用 PostSharp 之类的 AOP 工具
  • 动作过滤器
  • 其他?
0 投票
1 回答
552 浏览

oop - 处理跨领域问题

在编程中,横切关注点是一个常见的关注点(因为缺乏更好的术语)。

例如,如果您在类中对飞机及其所有复合部件进行建模,则各种设备将依赖于相同类型的部件。例如油箱、水箱等。

我的设计中有同样的问题要处理。除了AOP,还有什么策略可以解决这个问题?

谢谢

0 投票
1 回答
1303 浏览

nservicebus - 来自多个来源的订阅者的 NServiceBus 事件

如果我想在 nservicebus 中描述一个事件,我将创建一个从服务发布并由一个或多个订阅者使用的接口。

让我们将事件称为“系统错误”。每次到达代码中的某个点而我们无法进一步执行某些操作时,都会发布此事件。

所以这个事件最终可以由多个不同的逻辑服务发布。在只有一个服务发布此“系统错误”的情况下,让我们查看订阅者的配置文件

好的,到目前为止没问题。但是如果我们有两个发布这个事件的服务呢?

这不是一个有效的配置,因为有 2 个名为“SystemErrorMessages”的消息条目。

我们可以从“systemerror”事件继承,这样每个逻辑服务都会发布自己的“systemerror”,例如“appservice_systemerror”和“transportservice_systemerror”。

订阅者的配置如下所示:

但是如果我们在两台或更多台不同的机器上安装逻辑服务“transportservice”会是什么方法呢?所以我们有两个逻辑服务,其中一个服务安装在两个物理位置。

对于这样的问题,有什么可能的解决方案?是否有处理此类情况的任何 nservicebus 组件?我应该只发送消息而不是发布它们 - 不管这些消息指示事件而不是命令这一事实吗?

0 投票
2 回答
1387 浏览

java - JAX-RS 中的横切关注点

我正在 JAX-RS (JSR-311) 中寻找一种机制,以允许我提炼出一些特定于我的应用程序的横切关注点。例如,我的应用程序具有为每个请求查找或构建的特定上下文。我希望能够在一个集中的位置执行这种类型的逻辑,然后以某种方式附加到上下文以供各种资源用于请求的其余部分。如果我可以仅对 URL 的某些子集执行这些类型的操作,那就更好了。

JAX-RS 为路径段、cookie、标头等提供的默认注入很棒,但是对这些部分的自定义解释呢?我真的不想每次需要时都构建它。我宁愿有一种方法来指定它是如何构建的,然后将上下文组件作为我的资源方法的一部分注入。

有没有这样的钩子存在?我可以操纵提供者模型来做到这一点吗?顺便说一句,我想尽可能长时间地保持实现独立(Jersey、RESTEasy 等)。

提前感谢您的任何见解。

0 投票
2 回答
1346 浏览

c# - AOP 分离横切关注点

我正在尝试开始利用面向方面的编程来完成重复性任务。我不确定如何分离关注点。我正在使用 C# 和 AOP 我正在使用 Castle.DynamicProxy (使用 Autofac 的 InterceptedBy 功能),但我希望这个问题的答案可以是适用于其他 AOP 解决方案的足够普遍的建议(也许你可以说服我切换到不同的 AOP 解决方案)。

例如,我有类似以下拦截器的东西,它拦截对一个类的所有方法调用。它目前有两个问题:调用方法时,(1)测量调用花费了多长时间,以及(2)在调用之前和之后记录方法的名称。

我有一种压倒性的感觉,这里的时间问题(测量方法调用花费了多长时间)应该与日志记录问题(写入日志文件)分开,因为......嗯,它们是独立的问题。我正在考虑做这样的事情,但我不确定如何进行排序或将callTime变量放在哪里:

基本上我认为这里需要发生的是,不知何故,TimingInterceptor需要直接拦截方法,然后LoggingInterceptor需要环绕它。

人们使用什么方法来确保这些问题会以正确的顺序发生?我是否链接拦截器,让 LoggingInterceptor 拦截 TimingInterceptor 的 Intercept 方法?[InterceptOrder(1|2|3|...)]或者我是否在拦截器类上添加了某种属性?或者我可以[InterceptAfter(typeof(TimingInterceptor))]在 LoggingInterceptor 上放置类似的东西吗?

除了使用线程局部变量来跟踪调用时间,还有更好的选择吗?是的,我希望这是线程安全的。我在想将这个变量保留在堆栈上可能是首选,但我不确定 LoggingInterceptor 如何在不引入过多耦合的情况下获得 TimingInterceptor 的句柄(如果能够在不重新编译 LoggingInterceptor 的情况下切换 TimingInterceptor 实现会很好) .