从域模型中解耦昂贵的 I/O 操作

Decoupling expensive I/O operations from domain model

假设我的业务逻辑 User 具有用户名、地址 phone 和个人资料照片:

class User:
    def __init__(
        self, username: str, address: str, phone: str, profile_picture: np.ndarray
    ):
        self.username = username
        self.address = address
        self.phone = phone
        self.profile_picture = profile_picture

    def foo(self):
        ...

    def bar(self):
        ...

    def flip_profile_picture(self):
        self.profile_picture = np.fliplr(self.profile_picture)

我的Userclass的大部分操作不需要访问profile_picture属性,而且每次我需要操作时加载个人资料图片是相当昂贵的在 User 个实例上。

从用户那里抽象出个人资料图片的正确方法是什么?我想到的方法是创建一个实体 ProfilePicture 来保存 username 和数组数据。这意味着为 ProfilePicture class 创建一个存储库,假设用户想要翻转他的个人资料图片,则必须有一个接收用户的服务,即:

class ProfilePictureService:
    def __init__(self, profile_picture_repository: ProfilePictureRepository):
        self.profile_picture_repository = profile_picture_repository

    def flip_profile_picture(self, user: User):
        profile_picture = self.profile_picture_repository.get(user.username)
        profile_picture.flip()
        self.profile_picture_repository.update(profile_picture)

还有其他方法吗?总的来说,只有在真正需要它们时才避免对实体的某些属性进行昂贵的 I/O 操作的最佳方法是什么。

如果 DDD 术语不准确,请原谅,如果需要,我可以澄清任何事情。

Are there any other ways to do this? In general what is the best way to avoid expensive I/O operations on certain attributes from an entity only until they are actually needed.

对于 个人资料图片 之类的东西,您可能需要考虑为什么您的域模型会关心该数据(您是否为蓝色背景的会员提供特别折扣) ?如果域模型不需要它,则根本不要加载图片——将其从聚合中取出,将其存储在不同的数据库中。

但是如果您确实拥有模型需要的昂贵数据,但仅用于某些操作,通常的答案是创建分配给不同聚合的单独实体。

这通常意味着与同一用户相关的一堆信息分散在多个实体和集合中