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

architecture - 我应该如何在我的应用程序中构建日志记录?

所以我对此做了很多研究,但没有找到任何答案,我说“是的,那个”。我希望博学多才的 StackOverflow 人群可以帮助我。

我在几个不同的场景中遇到了这个问题。假设我有一个 C# 应用程序,并且我想要记录一些重要的事情。

我感兴趣的是我哪里得到logger

正如我所看到的,我有几个选择。

  1. 将其注入到构造函数中的 MyClass 中。
  2. 使用全球可用的服务定位器检索它。
  3. 使用方法装饰器和 AOP 为我完成日志记录。

这些似乎都不是很好的选择。#3 看起来是不可能的,因为我在我的业务逻辑中间记录,而不仅仅是简单地跟踪我的方法调用、输入参数和/或抛出的异常。#2,虽然看起来很简单,但单元测试真的很难。当然,我想对所有内容进行单元测试。#1,虽然它可以正常工作,但我所有的业务逻辑都被与业务对象本身无关的日志对象弄乱了。

任何替代想法或对上述选项之一的想法?非常感谢!

编辑:为了清楚起见,我已经知道如何进行 DI(我使用 Unity),并且我已经知道一个好的日志框架(我使用 log4net)。只是想知道如何以最智能的方式在整个应用程序中使用架构意义上的日志记录。


* 编辑 *

I marked Mark Seeman's answer as the solution. I went through my application and found that most of my logging calls were doing the same thing a decorator could do. Namely, log the entry to the method, any exceptions thrown, and exit return values.

Some cases I still needed to log directly inside a method. An example would be where I want to fail fast in a method which doesn't return anything but not throw an Exception. In those cases I have a singleton which holds a reference a LogProvider which will in turn retrieve a named log instance. The code looks similar to this:

LogProviderFactory has a method SetProvider which allows you to swap out the singleton. So in unit testing I can do:

The logging decorator uses the same LogProvider as the singleton (which it obtains through injection), so logging is unified throughout the system.

So really the end solution was mostly option #3, and a hybrid #2 (where it's the service locator pattern but the service is 'injected' into the locator).

AOP

As far as "aspect oriented programming" goes, I was a bit disappointed in the limitations of the language. Hoping AOP will be treated as a first-class citizen in future releases.

  • I tried PostSharp but couldn't get it running on my machine correctly. Additionally it was a big restriction that you had to have PostSharp installed on your system to use it (as opposed to just calling a dll which comes with the solution or something similar).
  • I used LinFu and was able to get it partially working. It blew up in a few instances however. The new 2.0 release is barely documented, so that was a hurdle.
  • Interface interception with Unity however seems to work well out of the box. I got lucky that most things I wanted to log were in classes implementing interfaces.
0 投票
2 回答
1298 浏览

security - CQRS 应用横切关注点,例如安全性

假设我有一个复杂的系统,那里有大量的人。简单的想法是员工/经理关系,许多员工向一位经理汇报。现在除了经理之外,还有能够代表经理行事的支持人员可以操纵经理的员工。

在 CQRS 系统中,您将如何为“编辑员工”的假设操作建模消息,其中操作的调用者是支持人员。仅当根据经理安全关系的工作人员对其领域内的员工执行操作时,该操作才能成功。

验证其安全性将涉及查询数据库以验证被修改的人确实在该经理的员工链中。

这个查询会出现在哪里?在发起“编辑员工”消息之前?

如果在生成消息之前预先验证数据,则在最终一致的系统中假设在处理“编辑员工”消息之前发生了一个单独的操作,该操作将删除用户完成“编辑员工”操作的权限. 如果命令处理程序没有验证该消息的安全问题,即使用户不再有权执行该消息,该消息仍然会成功。

这似乎意味着双面验证,类似于 UI 验证和服务器端验证将是最好的做法。然而,完成该验证的方法似乎违反了 CQRS 的关键原则。

在使用 CQRS 时必须处理这些和其他类似的横切问题时,哪种方法最好?

0 投票
0 回答
188 浏览

aop - 如何将 context(ApplicationContext) 作为参数传递给 logBefore Method(Method of Aspect)?

我想实现一个方面来避免延迟加载问题。那么如何将上下文(应用程序上下文)作为 logBefore 方法的参数传递?什么是签名切入点定义了上面的方法(我制作“???”的地方),知道这个方法(logBefore)将在所有具有“Set”作为结果类型和“slm. aoa.buisiness.facade”作为包

并感谢您的帮助。

0 投票
2 回答
2246 浏览

dependency-injection - 依赖注入 + 环境上下文 + 服务定位器

最近我读了很多关于应用程序设计模式的东西:关于 D​​I、SL 反模式、AOP 等等。原因——我想在设计上做出妥协:松散耦合、干净且易于使用。DI 似乎几乎是一种解决方案,除了一个问题:横切和可选依赖导致构造函数或属性污染。因此,我为此提出了自己的解决方案,我想知道您对此有何看法。

Mark Seemann(DI 书籍的作者和著名的“SL 是反模式”声明的作者)在他的书中提到了一种称为 Ambient Context 的模式。尽管他说他不太喜欢它,但这种模式仍然很有趣:它就像旧的好单例,只是它是作用域的并提供默认值,因此我们不必检查 null。它有一个缺陷——它没有而且它不知道它的范围以及如何处置自己。

那么,为什么不在这里应用服务定位器呢?它可以解决环境上下文对象的作用域和处置问题。在你说它是反模式之前:这是你隐藏合同的时候。但在我们的例子中,我们隐藏了 OPTIONAL 合同,所以 IMO 并没有那么糟糕。

这里有一些代码来说明我的意思:

编辑:我意识到不问具体问题与堆栈溢出设计相冲突。因此,我会将一篇最好地描述为什么这种设计不好或更好地提供更好的解决方案(或者可能是添加?)的帖子标记为答案。但是不要建议 AOP,它很好,但是当你真的想在你的代码中做一些事情时,它不是一个解决方案。

编辑 2:我添加了对 ServiceLocator.Current 的检查是否为空。这就是我的代码要做的事情:在未配置 SL 时使用默认设置。

0 投票
0 回答
1396 浏览

c# - 用于自动记录方法进入和退出的 Tracer 类

我想跟踪每个函数入口和出口。假设我的类包含三个方法 MethodA MethodB MethodC... 通过实例有人调用 MethodA 和 methodA 调用 MethodB 和 MethodB 调用 methodC

现在,当有人调用 test obj = new test(); 和 obj.MethodA(); 我希望跟踪器在数据库中写入类似“Entered MethodA”的下一行“Entered MethodB”下一行“Entered MethodC”,然后是“Exited MethodC”“Exited MethodB”,最后是“Exited Method a”

我的限制是:我不应该在每个方法进入和退出中编写此跟踪代码。我希望这会自动发生。只需将 App.config 文件的 Key 设置为 true,跟踪器就会开始操作,false 意味着跟踪禁用。

这是我们要调试的实时生产应用程序。

为此,我们有两种方法:

使用 Policy Injection Applicaiton 块用策略包装 Test 类的实例:从 ICallHandler 创建一个策略处理程序,然后创建一个 MatchingRule,在 MatchingRule 中读取 app.config 文件,如果启用了跟踪,则返回 true,否则返回 false。

这样做的缺点是:每次我们通过 Policy 容器创建任何类的 Instance 时,系统都会读取 app.config 文件,然后读取配置文件中存在的策略,即使跟踪被禁用......这可能会降级表现...

我们发现了另一种方法,即存在于 Logging Application Block 中的 Tracer 类。它有类似方法入口方法出口的功能。http://www.michaelhamrah.com/blog/2010/02/performance-tracing-for-your-applications-via-enterprise-library/

请提供更多关于 Tracer 类的想法。我的要求是否适合插入 Tracer 类。

  • POSTSHAP 不在我的预算中

非常感谢,

苏拉杰

0 投票
2 回答
1541 浏览

c# - 如何处理 ASP.NET MVC 3 应用程序中的横切关注点?

我有一个 ASP.NET MVC 3 Web 应用程序,其中包含各种组件/层,例如:

  1. 网络
  2. 服务(缓存、外部 API、云服务等)
  3. 核心(领域逻辑、POCO 等)
  4. 存储库(实体框架)

现在,当我在我的网站上做某事时(例如提交表单,也就是 POST)——在最坏的情况下,可能需要通知所有层。

现在,我可以将所有这些逻辑构建到我的控制器 HTTP POST 操作中,但它在逻辑上变得非常肥胖和沉重。

我曾尝试过使用发布者-订阅者模式 (AOP),但到目前为止我还没有找到一个非常好的 .NET 实现,而且我也有人告诉我这对于 Web 应用程序来说不是一个好的做法。

任何人都可以在这里给我任何建议,还是我坚持这样的代码:

我不是在这里谈论多线程或任何东西,而只是将责任从控制器上移开,并将其放在关心这些操作的组件上。

0 投票
1 回答
219 浏览

asp.net-mvc - 我可以在 web 表单中使用 mvc 过滤器属性吗?

我想用属性ala MVC 处理AOP aka 横切关注点。
我是否必须使用 AOP 框架或类似 Ninject 的具有拦截插件的东西?

0 投票
4 回答
761 浏览

c# - 为什么我们需要将序列化属性装饰到类和属性或实现一些接口来持久化数据?

据我了解,大多数序列化/反序列化技术使用反射来创建对象并设置或获取值。那么为什么要在类中显式绑定这些属性,例如 [XmlIgnore]... 用于 xml,[Serializable]... 在二进制序列化中,[JsonPropery]...Json.Net 等。既然这些就对象而言就像横切关注点,我们不能在对象之外做同样的事情吗?

如果关注点分开,用户可以控制对象图/树的哪一部分需要在哪个上下文以及如何进行序列化/反序列化等?

是否有任何这样的框架使整个序列化成为方面,即在类的关注之外?

Edit1:我的要求如下我的应用程序将数据存储在一个巨大的树形结构中。客户的要求是能够以 xml 格式序列化某些数据,以及 Json 中的某些数据(我不知道为什么这样要求),我们将大部分数据以二进制序列化为遗留代码。

现在有一些类,其中一部分数据需要以 XML 格式显示,而另一部分(这些也可以是 xml 数据或二进制序列化数据的一部分)在 Json 中。

所以我正在寻找一个解决方案

  1. 类不应该知道任何特定于序列化的属性,相反,序列化程序框架可以提供足够的工具来轻松地进行序列化而无需触及类。
  2. 该框架应该允许保留我想要的私有和公共数据。这可以特定于类或实例,也可以特定于某些上下文中实例的某些属性。
    例如
    • SaveTemplate:应该只保存树的每个分支中的几个节点
    • SaveDocument:应该完全保存树中的一个分支
    • SavePackage:应该保存整个树。
  3. 应该允许序列化为不同的格式,如 xml、二进制、json 等以用于不同的目的。

所以我计划评估某些序列化框架以实现相同的目标。我发现 Json.Net 可以给我以下

  • 没有像xml 序列化一样为公共属性放置序列化标签。
  • 向后兼容二进制序列化。即我不必更改二进制序列化接口实现
  • 不需要参数少的构造函数。

但是,我仍然需要上面第 2) 和 3) 点中提到的能力。我还没有详细探索过 Json.Net 或任何其他框架。

有什么框架可以帮助我实现同样的目标吗?

0 投票
3 回答
2127 浏览

c# - CRM 2011 插件中的线程/环境上下文

我们最近有几次提出这样的问题:在 Dynamics CRM 2011 中,是否Execute()保证一个插件执行(即方法的传递)保持在同一个线程上。

我想使用环境上下文模式来实现跟踪,以避免将跟踪服务传递给任何可能想要跟踪的类。问题是我们知道插件每个注册步骤只实例化一次,然后从同一个实例提供所有后续操作;这意味着我不能只拥有一些像Tracing.Current我分配当前ITracingService实例的静态属性,我很高兴。如果我这样做了,最后开始的操作将覆盖所有其他可能仍在运行的操作的实例(这种并发并不少见)。

现在,如果我可以确定Execute()方法下的所有内容都保留在同一个线程中,我仍然可以使用环境上下文,利用[ThreadStatic]静态字段的属性:

我会在输入Execute()方法时设置它并在最后清除它,以便删除对跟踪服务实例的引用。

在 MSCRM 插件的上下文中,我唯一能找到的关于线程的事情是,显然各个线程来自 ThreadPool - 无论对我的问题可能产生什么后果。

有没有人更深入地了解如何使用 MSCRM 插件处理线程 - 或者关于如何在这种特殊情况下使用 SOLID 代码优雅地处理跟踪的横切关注点的任何其他想法(AOP/动态拦截在这里没有选项)?

感谢您的任何帮助和指点。

0 投票
1 回答
213 浏览

php - 我们可以通过用 PHP 扩展函数来在函数中注入更多行吗?

我对正在为我的自定义框架开发的事件系统有一个想法。

想象一个像这样的伪函数。

想象一下,您需要为更多功能做同样的事情。(也许您想记录在运行时运行的函数并希望将它们记录在单独的文件中。)

除了手动将事件添加到函数中,我们可以做这样的事情吗?

这个想法是注入hi()内部的函数,并从外部Test class注入我们在函数中传递的任何内容extend'before'意味着注入必须在目标函数的第一行。

最后,事件和事件绑定完全从函数中抽象出来。我希望能够在不改变功能的情况下绑定自定义的东西。

我有一种感觉,我们可以通过修改eval()或玩弄call_user_func(). 不过,我不确定。使用eval()听起来已经很糟糕了。

我的问题是;

  1. 有可能与PHP有关吗?
  2. 它是否在 OOP/OOP 原则中有名称,以便我可以进一步阅读?
  3. 它有任何意义还是一个坏主意?