问题标签 [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 投票
2 回答
543 浏览

design-patterns - 横切关注日志

我想记录有关正在执行的方法的某些信息,我认为 AOP 没问题,敲了一个演示,但我确实需要记录每个方法的特定信息,将其视为与调用相关的附加信息。

现在我考虑的选项只是在每种方法中记录它,但我认为它会污染代码,最后的手段,也许

或者我创建一个将方法映射到需要记录的信息的类,并使用 AOP 记录此信息。

你们有什么感想?

0 投票
2 回答
2944 浏览

c# - 领域驱动设计和横切关注点接口定义

我的公司正在尝试采用 DDD。似乎 DDD 的指导是要求域程序集定义其所有服务接口,并允许实现者对域程序集进行引用并实现服务接口。然后使用 DI 域将获得实现。但是,对于横切关注点,要​​求域组件重新定义诸如日志记录等不是该组件的核心业务域的接口似乎是不负责任的。我注意到许多商业组件(例如 Quartz.NET)正在使用标准的、广泛接受的接口集(例如 Apache Commons)以框架友好的方式解决横切关注点。这是否与 DDD 方式一致,还是真的有像 AOP 这样的跳跃,

以供参考:

来自http://www.infoq.com/articles/ddd-in-practice

“这些是可重用的非域相关问题,通常倾向于分散和重复包括域层在内的整个代码。在域对象中嵌入此逻辑会导致域层与非域相关代码的纠缠和混乱。”

来自http://cyrille.martraire.com/2009/12/your-crosscuttingconcerns-are-someone-else-core-domai/

“您的横切关注点是其他人的核心领域”

0 投票
2 回答
7074 浏览

c# - 作为装饰器记录与依赖注入 - 如果我需要在类中登录怎么办?

(我最初在此评论中问了这个问题,但 Mark Seemann 让我创建一个新问题。)

我正在启动一个新应用程序(.NET Core,如果这很重要),现在我正在尝试决定如何准确地进行日志记录。

普遍的共识似乎是日志记录是一个横切关注点,因此不应将记录器直接注入应该记录的类中。

通常,有一个类似以下类的示例如何这样做:

相反,具有业务逻辑的类不应该知道记录器(SRP),并且应该有一个单独的类来进行记录:

每当IExample需要 an 时,DI 容器都会返回一个 的实例LoggingBetterExample,该实例在后台使用BetterExample(其中包含实际的业务逻辑)。

这种方法的一些来源:

Mark Seemann的博客文章:

Steven的博客文章和 SO 回答:


我的问题:

显然,该LoggingBetterExample方法只有在日志记录可以在实际类之外完成时才有效。(就像上面的例子:捕获从外部
抛出的任何异常)BetterExample

我的问题是我想在实际课程中记录其他内容。
Mark Seemann在这里怀疑,如果有人需要这样做,也许有问题的方法做得太多了。

正如我之前所说,我正处于一个新应用程序的规划阶段,所以我没有太多代码要展示,但我现在正在考虑的用例是这样的:

我的应用程序将有一个带有一些可选值的配置文件。
用户可能决定省略可选值,但这样做是一个重要的决定。
因此,当某些可选值丢失时,我想记录一个警告,以防万一发生错误。
(虽然省略这些值很好,所以我不能只是抛出异常并停止)

这意味着我将拥有一个读取配置值的类,并且需要执行以下操作(伪代码):

无论ReadConfigValues是在这个班级还是其他班级,我都不认为这个班级会违反 SRP。

当我无法使用装饰器在实际课程之外登录时,是否有比注入记录器更好的解决方案?

我知道我可以读取内部类中的配置文件,但检查装饰器中的值(并记录警告)。但是 IMO 检查值是业务逻辑而不是基础设施,所以对我来说它属于读取配置文件的同一类。

0 投票
0 回答
617 浏览

api - REST API:管理路由,/entity/admin 还是 /admin/entity?

实现一个 RESTful API,并设置了一个文件结构,如下所示:

Admin/sudo 路由可以进入api/admin/entity_name.tsapi/entity/admin.ts.

前者很有用,因为所有管理员控制都在一个地方,更易于审核、标准化、关闭所有管理员访问等。后者很方便,因为它非常接近“普通用户”实现。

哪个选项最好?

0 投票
1 回答
192 浏览

javascript - 流星与咒语。横切关注点

我正在用咒语在流星中开发应用程序。这是一个 routes.jsx 的users模块。我希望能够在其他模块的操作和路由中使用requireLogin和。redirectUsers或者一般来说,我如何在不违反咒语架构的情况下处理横切关注点?

0 投票
2 回答
2366 浏览

http-headers - 如何在骆驼上下文中创建一个临时变量以供以后在路线中使用

我有一条与 4 个 http 端点交互的路由。第一个 http 端点是一个授权服务,我将从中获得一个身份验证令牌。我想要的是,一旦我从授权服务获得令牌,我会将令牌传递给标头中的每个进一步的 http 服务。那么我该如何实现呢?有没有办法使用令牌值创建一个临时变量,如果我可以将它放在上下文中,那么我可以在任何端点中设置它。否则我在想我是否可以在应用程序启动时调用一次授权服务并将令牌存储在某处并且我可以使用它。

0 投票
1 回答
2734 浏览

aop - What are scattering and tangling in aop

I am trying to understand the separation of concerns used within AOP. Therefore i would appreciate if someone could explain me what does mean code scattering and code tangling in AOP using some basic HelloWorld examples. How would i know afterwards if a given concern is not a system-core concern but rather an aspect? Many thanks.

0 投票
2 回答
1345 浏览

c# - 横切层 | 自动映射器 | 依赖注入

我有一个 MVC 分层应用程序,我对横切层有一些疑问。到目前为止,这一层有日志记录、DI、错误处理和缓存。

我创建了一个项目并将所有这些功能按文件夹分开。这个可以吗?或者我应该为每个功能创建一个项目?

因为我在这个项目中设置了 Autofac(DI 文件夹),所以我必须添加对其他项目的引用:模型、存储库和服务。可以将这些引用添加到横切项目吗?

我应该创建一个单独的项目来对常用功能进行分组吗?例如枚举、常量和 GetMd5Hash 等方法。或者我应该为此使用横切项目吗?

我应该将 Automapper 视为交叉关注点吗?到目前为止,我在 Presentation 层中设置了它,以便从 Entity 转换为 ViewModel 并将 ViewModel 转换为 Entity。正因为如此,我不得不添加一个我想避免的对 Model 的引用。

0 投票
1 回答
472 浏览

java - 跨层收集数据以编写审计日志

背景

有问题的应用程序是部署在 Tomcat 中的 Java Web 应用程序,并使用 Apache CXF 公开 REST 服务。我找到了 Spring 配置,但不确定它与 CXF 基础设施的连接情况。

每次发生重要事件时,例如更新或删除实体,我想记录信息,包括(但不限于):

  1. 发生了什么
  2. 谁提出了请求
  3. 改变了什么实体
  4. 实体的新状态(如果适用)
  5. 有关发送的任何通知电子邮件的信息
  6. ETC...

当前设置和挑战

我们有几个层,调用看起来像这样:控制器 > 服务 > 数据层 > 实用程序(电子邮件、SMS 发送等......)。

问题是,我想要收集和记录的数据开始可用并且仅在单独的层中可用。有时数据通过参数传递到下一层,但有时它们没有传递,因为其他层不需要数据。这里有些例子:

  • 一些 HTTP 请求相关数据仅用于一些验证,并不会发送到服务层。
  • 有时,核心实体数据仅在服务层和数据层可用,而对控制器不可用。
  • Utils 的各个层会生成一些其他层不知道的最终数据片段(如链接、代码、最终电子邮件内容)。

但我需要从所有层收集此类信息并将它们记录为审计目的,作为单个日志行。

约束

  • 代码在尊重层边界方面设计得不好。所以,有时事情会在不应该的地方传递。但我不能继续这样做。
  • 我无法将所有需要的数据返回到控制器并最终将它们记录在那里,因为中间层的方法在很多地方都被调用,并且全部重构它们是不切实际的。
  • 我不能将它们分别记录在不同的地方,因为要求不允许这样做。如果没有其他方法,我可以推送这个策略,并有一个共同的请求 ID 或其他东西和多个日志行,以将它们关联起来。

我的问题是,我应该如何以及在哪里收集所有这些数据并将它们写入审计日志?在 Java Web 应用程序中执行上述操作的最佳实践是什么?

0 投票
2 回答
714 浏览

c# - 使用 c# 为非常不同的方法实现横切验证器

我有一个带有客户端/服务器架构的小框架我在我的业务层中使用这个工具:

DI = SimpleInjector

DynamicProxy 拦截 = Castle.Core

现在我需要验证一些验证!例如看这个方法:

但是,我有很多方法,我的方法彼此非常不同,那么解决方案在哪里?因为我无法为我的方法创建一个好的抽象。

如何实现横切功能来验证我的参数?

我想我可以使用拦截器和属性来做到这一点,例如[Validate(ValidateEnum.NotNull)]每个参数的属性。

什么是正确的方法?

我的实体的第二个问题:我能否获得流畅的 API 验证规则,以使用带有拦截器的反射来验证实体?

例如我想获取规则,如果有IsRequired()规则,验证为不为空。

我不想使用装饰器模式,因为它让我重构了很多;