Orm 撕裂,它的位置和它所属的区域。为什么它要负责点和区域之间的转换?至少我是这么看的。

Orm 撕裂,它的位置和它所属的区域。为什么它要负责点和区域之间的转换?至少我是这么看的。,orm,domain-driven-design,entity,repository-pattern,ddd-repositories,Orm,Domain Driven Design,Entity,Repository Pattern,Ddd Repositories,我使用同样的方法,就像你一样,我无法确信这是一个糟糕的设计。但是,我有到我的存储库的接口,所以我不使用ZoneRepository的具体实现,因为这样做可能会变得很困难,并且取决于上下文,无法对其进行测试和模拟 另一点,正如@Samich所说的,根据Store对象中的一个点查找区域的知识听起来不错,因为以后您可能会想在其他地方使用此方法。如果你为这些区域实施了一项服务,那么你将集中你的代码,同时避免冗余。我使用同样的方法,和你一样,我无法确信这是一个糟糕的设计。但是,我有到我的存储库的接口,所以

我使用同样的方法,就像你一样,我无法确信这是一个糟糕的设计。但是,我有到我的存储库的接口,所以我不使用ZoneRepository的具体实现,因为这样做可能会变得很困难,并且取决于上下文,无法对其进行测试和模拟


另一点,正如@Samich所说的,根据Store对象中的一个点查找区域的知识听起来不错,因为以后您可能会想在其他地方使用此方法。如果你为这些区域实施了一项服务,那么你将集中你的代码,同时避免冗余。

我使用同样的方法,和你一样,我无法确信这是一个糟糕的设计。但是,我有到我的存储库的接口,所以我不使用ZoneRepository的具体实现,因为这样做可能会变得很困难,并且取决于上下文,无法对其进行测试和模拟


另一点,正如@Samich所说的,根据Store对象中的一个点查找区域的知识听起来不错,因为以后您可能会想在其他地方使用此方法。如果您为这些区域实施了一项服务,那么您将集中您的代码并避免冗余。

不一定会说这种设计不好。它只是提出了一些问题。大多数情况下,不需要从实体中使用存储库。让商店根据地理位置查找自己的区域似乎有点奇怪。看起来这个责任不属于商店

总是需要点吗?如果用户希望从“最后5个区域”列表中选择区域,该怎么办?或者来自国家/城市下拉列表?还是从搜索文本框?在这些情况下,没有必要强调这一点。需要point和repository看起来就像是根据UI模型定制域模型

如果您确实需要为每个门店设置一个点,那么您可能不需要同时设置区域字段。如果您仅在需要时动态查找商店的区域,该怎么办?使用最新的点到区域数据库


另外,如果您的Store类有5个或6个方法,并且其中只有一个需要zoneRepository字段,那么该类就不是很好。

不一定说这种设计不好。它只是提出了一些问题。大多数情况下,不需要从实体中使用存储库。让商店根据地理位置查找自己的区域似乎有点奇怪。看起来这个责任不属于商店

总是需要点吗?如果用户希望从“最后5个区域”列表中选择区域,该怎么办?或者来自国家/城市下拉列表?还是从搜索文本框?在这些情况下,没有必要强调这一点。需要point和repository看起来就像是根据UI模型定制域模型

如果您确实需要为每个门店设置一个点,那么您可能不需要同时设置区域字段。如果您仅在需要时动态查找商店的区域,该怎么办?使用最新的点到区域数据库


另外,如果您的Store类有5或6个方法,并且其中只有一个需要zoneRepository字段,那么该类就不是很重要。

那么该服务是我的实体和我的存储库之间的链接吗?我可以将服务注入存储实体吗?那么服务就是我的实体和存储库之间的链接了吗?我可以将服务注入存储实体吗?确实是一种有趣的方法,但是这种转换应该在哪里进行呢?另外,我忘了提到位置实际上也是商店实体的一部分,我编辑了代码以反映这一点。我添加了一些解释和示例。我非常喜欢你的方法,但有点担心与商店的合同,这基本上允许应用程序的任何层将不匹配的位置和区域分配给应用程序本身。如何强制执行只有StoreLocationHandler才能调用
store.assignLocation()
,而StoreLocationHandler是唯一知道将位置与区域匹配的正确业务规则的人?在最初的方法中,我喜欢的是这个规则是在商店中强制执行的,在应用程序的任何地方都不可能违反。我明白你的意思。如果保持点和区域之间的一致性很重要,我将添加另一个值对象,而不是将这两个作为单独的参数传递,我们称之为位置,它将包含坐标和区域的信息。我将修改示例代码以反映这一点。您可能仍然认为,现在逻辑不是在存储中强制执行的,而是在某些服务或存储库中强制执行的,因此有人可以创建一个人造的无效对象并将其传递给您的域。在这种情况下,不允许在此服务/Repo之外创建对象。确实是一种有趣的方法,但是这种转换应该在哪里进行呢?另外,我忘了提到位置实际上也是商店实体的一部分,我编辑了代码以反映这一点。我添加了一些解释和示例。我非常喜欢你的方法,但有点担心与商店的合同,这基本上允许应用程序的任何层将不匹配的位置和区域分配给应用程序本身。如何强制执行只有StoreLocationHandler才能调用
store.assignLocation()
,而StoreLocationHandler是唯一知道将位置与区域匹配的正确业务规则的人?在最初的方法中,我喜欢的是这个规则是在商店中强制执行的,在应用程序的任何地方都不可能违反。我明白你的意思。如果保持点和区域之间的一致性很重要,我将添加另一个值对象,而不是将这两个作为单独的参数传递,我们称之为位置,它将包含坐标和区域的信息。我将修改示例代码以反映这一点。您可能仍然会争辩说,现在这种逻辑不是在商店中强制执行的,而是在某些服务或寄存器中强制执行的
    public class StoreLocationHandler : Handles<LocateStoreCommand>
    {
        public void Handle(LocationStoreCommand command)
        {
            // Location contains coordinates as well as zone info and can be obtained only via LocationService
            Location location = LocationService.IdentifyZone(command.Coordinates); 

            Store store = StoreRepository.Get(command.StoreId);

            store.AssignLocation(location);

            // persist changes - either by Unit of Work or Repository
        }
    }