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