我有一个web应用程序,它的架构有点像前端控制器MVC设计。我接收HTTP请求,路由它们,通过过滤器层运行它们,将它们分派给我的域类,然后在必要时通过数据层类访问智能数据服务。然后,域类向知道如何生成HTTP/web页面输出的表示类返回一个标准有效负载。
该应用程序有三个主要的交叉关注点:审计日志记录、检测/度量和本地化。前两个需要用于组合根、域、数据和表示类别中的几乎每个类。后者,只在少数几个类中,尽管它们都在我的域中和我的表示层中。
我的应用程序使用依赖注入容器。将上述3个服务添加为依赖项会导致代码闻起来:构造函数中的参数太多,每个类实际上不需要执行自己的响应,但必须能够访问。
我读了很多书(马克·西曼,谢谢你在相关话题上发表的大量文章!)试图为我的处境找到一个最佳的解决方案。我可以想象出几种可能性:
我确实希望保留我的能力,单元测试一切,并使用模拟/存根。
还有其他我忽略的可能性吗?(顺便说一句,重新设计整个应用程序不是一个选择。)
发布于 2020-11-02 16:17:40
我只是把它们注射进去,并不怎么想,但试着将前两种方法自动化。
在Symfony中,容器会在实现FIG LoggerAwareInterface的任何类中自动注入记录器。在您的堆栈中自动化它可能也是值得的。您不会说您的DIC来自何处,但是如果它是标准的,这可能是一个已知的用例,如果您编写了它,您可以自己添加这个特性。
我喜欢这种方法,因为它不膨胀DIC的定义,使它们更容易理解和确定。只要在您意识到需要一个记录器调用时,在您正在处理的同一个文件中添加一个接口和一个特性(这非常简单和标准,因此它来自同一个PSR),就可以方便地将记录器添加到任何类中。
提供度量方面的建议比较困难,因为您没有说出您正在测量的内容。如果它们无处不在,我可能会遵循与记录器相同的模式。不过,你必须为这些用户编写自己的10行界面和特性。
我有点惊讶,您需要在表示层之外进行本地化,除非您的域在i18n方面确实有本地化,例如实体的本地化版本。即使如此,我也希望这是一个不同于本地化UI的工作。在任何情况下,由于您提到只有少数类需要此功能,所以我将手动添加该依赖项。
https://softwareengineering.stackexchange.com/questions/412783
复制相似问题