首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉关注点和依赖注入

交叉关注点和依赖注入
EN

Software Engineering用户
提问于 2020-07-15 21:39:45
回答 1查看 630关注 0票数 3

我有一个web应用程序,它的架构有点像前端控制器MVC设计。我接收HTTP请求,路由它们,通过过滤器层运行它们,将它们分派给我的域类,然后在必要时通过数据层类访问智能数据服务。然后,域类向知道如何生成HTTP/web页面输出的表示类返回一个标准有效负载。

该应用程序有三个主要的交叉关注点:审计日志记录、检测/度量和本地化。前两个需要用于组合根、域、数据和表示类别中的几乎每个类。后者,只在少数几个类中,尽管它们都在我的域中和我的表示层中。

我的应用程序使用依赖注入容器。将上述3个服务添加为依赖项会导致代码闻起来:构造函数中的参数太多,每个类实际上不需要执行自己的响应,但必须能够访问。

我读了很多书(马克·西曼,谢谢你在相关话题上发表的大量文章!)试图为我的处境找到一个最佳的解决方案。我可以想象出几种可能性:

  1. 使用面向方面的编程库,它将检查我的代码,并允许我添加任意的点削减(连接点),并将我的服务连接在这些点上作为建议。这看起来很优雅。我确实担心会增加更多的复杂性、依赖性和性能成本(我在一些数据非常重的页面上施加了执行限制)。
  2. 使用一些变化的抽象工厂模式,允许叶类获得它们所需的“外部”依赖关系。这将需要一些困难的重构,因为核心结构在第三方库中,我宁愿不进行定制,也不愿意轻易地进行装饰。
  3. 为需要记录、记录度量或本地化的类创建解码器。这正是方面库将自动完成的任务,不是吗?然而,它可以解决性能方面的问题。
  4. 使用环境上下文对象。我的读物说这是个糟糕的选择。
  5. 注入DIC,并与代码气味共存。;-)

我确实希望保留我的能力,单元测试一切,并使用模拟/存根。

还有其他我忽略的可能性吗?(顺便说一句,重新设计整个应用程序不是一个选择。)

EN

回答 1

Software Engineering用户

发布于 2020-11-02 16:17:40

我只是把它们注射进去,并不怎么想,但试着将前两种方法自动化。

在Symfony中,容器会在实现FIG LoggerAwareInterface的任何类中自动注入记录器。在您的堆栈中自动化它可能也是值得的。您不会说您的DIC来自何处,但是如果它是标准的,这可能是一个已知的用例,如果您编写了它,您可以自己添加这个特性。

我喜欢这种方法,因为它不膨胀DIC的定义,使它们更容易理解和确定。只要在您意识到需要一个记录器调用时,在您正在处理的同一个文件中添加一个接口和一个特性(这非常简单和标准,因此它来自同一个PSR),就可以方便地将记录器添加到任何类中。

提供度量方面的建议比较困难,因为您没有说出您正在测量的内容。如果它们无处不在,我可能会遵循与记录器相同的模式。不过,你必须为这些用户编写自己的10行界面和特性。

我有点惊讶,您需要在表示层之外进行本地化,除非您的域在i18n方面确实有本地化,例如实体的本地化版本。即使如此,我也希望这是一个不同于本地化UI的工作。在任何情况下,由于您提到只有少数类需要此功能,所以我将手动添加该依赖项。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/412783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档