我有一个对地理数据进行操作的特定域。我正在 TypeScript 和 NodeJS 中实现这个项目,并有以下类:
-
Point- 包含纬度和经度的值对象
-
Area- 包含点集作为形状定义的值对象
-
Sector- 实体(它不是持久的,但它是可变的) - 包含区域和位于其中的点集
现在我需要实现一个名为isPointInside(point: Point)
计算提供的点是否适合区域内。我不想自己实现它,因为有一些库可以为我实现它。现在我决定使用那个:https://github.com/manuelbieh/Geolib https://github.com/manuelbieh/Geolib .
另外,我正在使用名为 inversifyjs 的 TypeScript IoC 框架,没什么花哨的 - 通过注释提供 DI。
因此,我创建了一个名为“GeoService”的接口,它提供了负责地理计算的方法,并且我打算在该域模型中大量使用它。使用 inversify 我提供了 GeoLib 适配器来实现我的接口,我真的很想在我的 Area 类中以某种方式使用它。
所以这是第一个问题,但这并不是我斗争的结束:-)。
我还有另一门课,叫做扇区网格,包含二维数据结构中的扇区网格(在此用例中每个扇区都是正方形)。扇区网格有一个方法addPoint(point: Point)
。该方法的职责是找到一个提供适合点的扇区,如果找不到,则创建它。现在它不仅需要 GeoService 来计算扇区的初始点应该在哪里(距网格中心的距离),而且还需要创建扇区 - 我在编写测试时遇到了这个问题,有太多逻辑,我我们决定向 SectorGrid 提供某种扇区工厂,不仅是为了简化测试,而且是为了封装扇区创建逻辑(这非常复杂)。因此,现在要注入另一项服务,但不知道如何以不会导致问题的方式进行操作。
目前,我只是将这两个服务作为这些类的静态属性注入,但这并不是我引以为豪的事情,我正在寻找其他选项。
我知道我的设计可能过于复杂,我正在寻找一种简化它的方法,但我不想以贫血领域模型结束。拥有像 Area 对象这样的东西并且无法将地理计算放入其中,对我来说听起来就像贫血模型一样。
此外,我还阅读了很多有关向实体注入服务的讨论,但没有一个让我满意,因为他们要么提供“不要这样做”或“只做这个而不用打扰”之类的结论,要么提供解决方案就像完全不适合我的情况的领域事件。