DDD中的工厂模式

Factory pattern in DDD

在 DDD 中使用工厂的正确方法或建议方法是什么?

工厂方法应该从应用程序服务接收所有必要的参数,还是允许我们在工厂内注入存储库并提取所需的数据?

应该是(例1):

public class UserTokenFactory : IUserTokenFactory
    {
        IUserTypeResourceRepository _userTypeResourceRepository;
        public UserTokenFactory(IUserTypeResourceRepository userTypeResourceRepository)
        {
            _userTypeResourceRepository = userTypeResourceRepository;
        }

        public async Task<UserToken> CreateWithAsync(User user)
        {
            var userTypeResources = await _userTypeResourceRepository.GetByUserTypeIdAsync(user.UserTypeId);

            //Some logic for creating user tokens
            throw new NotImplementedException();
        }
    }

或如(示例 2)

public class UserTokenFactory : IUserTokenFactory
    {
        IUserTypeResourceRepository _userTypeResourceRepository;
        public UserTokenFactory(IUserTypeResourceRepository userTypeResourceRepository)
        {
            _userTypeResourceRepository = userTypeResourceRepository;
        }

        public UserToken CreateWith(User user, List<UserTypeResource> userTypeResources)
        {
            //Some logic for creating user tokens
            throw new NotImplementedException();
        }
    }

您可以将服务注入工厂。您的工厂基本上是一个恰好创建对象的域服务。但是,我可能会在这里依赖 ISP 并定义一个像 IResolveUserType 这样的接口,而不是依赖于更广泛的 IUserTypeResourceRepository 接口。