(注入的)服务之间的依赖关系

Dependencies between (injected) services

我正在构建一个 Web 应用程序并且有一个业务逻辑服务层。这些服务被注入到控制器中。现在,我想知道在以下情况下最佳做法是什么。


我有一个 AuthenticatorService,不出所料,它负责身份验证。当用户尝试进行身份验证时,这显然是应该记录的内容。这是 LoggerService 可以处理的事情。

现在,我正在向 AuthenticatorService 中注入一个 LoggerService,但是服务之间的依赖关系感觉不是很干净...

我将具体类型绑定到接口,所以从逻辑上讲我会说这很好 - 显然,绝对可以肯定注入的服务永远不会有理由依赖另一个,从而创建一个循环依赖。

我很想知道其他人是如何解决这个问题的——或者,这是否根本不是问题。

请不要建议从控制器处理日志记录 - 这只是一个例子,还有很多可以想象的情况,其中一个服务可能想要调用另一个。

I'm very interested in reading how others are solving this problem - or, whether it is not a problem at all.

是的,这是一个问题 - 事实上,这是最常被问及的问题之一。这个问题的名称是crosscutting concerns。有几种不同的方法可以解决这个问题。

  1. 特定于框架 - 在 MVC/WebApi 中,有 filters 可以 运行 在特定控制器、操作或每个请求中使用逻辑。
  2. 使用第三方 Aspect-Oriented Programming (AOP) framework
  3. 使用常见的设计模式,例如 proxy or decorator. Here is an proxy example using the .NET RealProxy class
  4. Interception,几个主要依赖注入框架内置的功能。