2

我正在开发一个应用程序,试图遵循六边形架构和干净架构的建议。将应用程序划分为层:基础设施、应用程序和模型。所有这一切都在关注我导入的包,并且在基础设施层中只存在与框架的依赖关系。

怀疑来自模型中的实现。大多数情况下,如果您验证字符串的最大大小或最大值和数字,您可以使用常量,如果在构造函数中不满足条件,则会引发异常:

@Value
public class UserName {

    String value;

    public UserName(String value) {
        validate(value);
        this.value = value;
    }

    private void validate(String value) {
        if (value.length() > 100) {
            throw new IllegalArgumentException();
        }
    }
}

问题是,如果我想参数化这些验证的最大值,或者在属性或数据库文件中,例如。该机制将与加载应用程序框架使用的数据的方式相结合。什么时候应该验证?

通过属性服务加载用例(应用层)中的值。例如:

public class CreateUser() {

    private PropertiesService propertiesService;

    public User create(String nameValue) {
        UserName userName = new UserName(nameValue, propertiesService.getMaxNameLegth());
        //...
        
    }
}

@Value
public class UserName {

    String value;

    public UserName(String value, int maxValue) {
        validate(value);
        this.value = value;
    }

    private void validate(String value) {
        if (value.length() > maxValue) {
            throw new IllegalArgumentException();
        }
    }
}

或者创建一个验证器,将类传递给该验证器并验证其所有属性:

@Value
public class UserName {

    String value;

    public UserName(String value, int maxValue) {
        this.value = value;
    }
}

public interface UserNameValidator {
    void validate(UserName userName);
}

public class UserNameValidatorImpl {

    private PropertiesService propertiesService;

    public void validate(UserName userName); {
        if (userName.getValue().length() > propertiesService.getMaxNameLegth()) {
            throw new IllegalArgumentException();
        }
        
        // validate all atributes
    }
}

public class CreateUser() {

    private UserNameValidator userNameValidator;

    public User create(String nameValue) {
        UserName userName = new UserName(nameValue);
        userNameValidator.validate(userName);
        //...
        
    }
}

什么是最好的解决方案?最干净的?其他更好的可能性?谢谢。

4

1 回答 1

0

怀疑来自模型中的实现。大多数情况下,如果您验证字符串的最大大小或最大值和数字,您可以使用常量,并且如果在构造函数中不满足条件,则会引发异常:

您是否因为域规则或由于列长度等数据库约束而验证名称的长度?

也许验证属于数据库层而不是域层。

通过属性服务加载用例(应用层)中的值。...或...创建一个验证器,将类传递给该验证器并验证其所有属性

如果验证规则是域规则并且它们应该在运行时加载,它们应该像任何其他持久数据一样被处理。

+----------------+           +----------------+                  +-----------------------+
|      User      |  -------> | UserValidation |     <---------   | ValidationRepository  |
+----------------+           +----------------+                  +-----------------------+
                                                                            ^
                                                                            |
============================================================================|=============
                                                                            |
                                                                 +----------+------+ 
                                                                 |                 |
                                                            +------------+     +--------+
                                                            | Properties |     |   DB   |
                                                            +------------+     +--------+

传递ValidationRepository给你的CreateUser

public class CreateUser {

    private ValidationRepository validationRepository;

    public User create(String nameValue) {
        UserValidation userValidation = validationRepository.getUserValidation();
        UserName userName = new UserName(nameValue, userValidation);
        //...
        
    }
}

当 aUser应该被创建时,您可以UserValidation从 the中获取ValidationRepository并将其传递给Useror UserName

public class UserValidation {

    // should be set (or passed as constructor arg) by the repository implementation
    private int useNameMaxValue;

    public String validateUserName(String userName){
        if (userName.length() > maxValue) {
            throw new IllegalArgumentException();
        }
    }

}

UserUserName仅使用UserValidator.

public class UserName {

    String value;

    UserName(String value, UserValidator validator) {
        this.value = validator.validateUserName(value);
    }

}
于 2021-06-09T05:30:38.683 回答