Repository是否可以根据它(虚拟)包含的对象返回布尔值?
例如:
if (userRepository.checkCredentials(username, password))
{
// ...
或者以冗长的方式做到这一点是更好的方法:
user = userRepository.findByUsername(username);
if (user != null && user.checkPassword(password)) {
{
// ...
答案 0 :(得分:7)
听起来更像规范不是吗?
if (canAuthenticateSpec.isSatisfiedBy(username, password))
在过去,我已经使用规范进行了此操作,因此我可以清楚而简单地检查我的代码。
但是,最近,我使用一项服务来完成这项工作,并根据为什么进行身份验证来构建结果。所以,像这样:
AuthenticateResult result = slAuthenticator.Authenticate(username, password)
if (result.authenticated) {
user = result.user
} else {
String message = result.failureReason;
答案 1 :(得分:4)
存储库是一种封装存储,检索和存储的机制 搜索行为模拟对象集合。
我认为从存储库返回布尔值是可以的,但前提是该方法涉及此存储库中的所有对象。存储库通常公开类似集合的接口。例如,users.IsEmpty()
或users.IsNameUnique("jdoe")
似乎是合乎逻辑的,因为它们需要访问整个集合。
在您的方案中,只能按名称查找用户是可以分配给存储库的职责。检查密码是否有效似乎不适合存储库。所以第二种更冗长的方法对我来说似乎更好。
或者,您可以在域中拥有专用的Authenticator接口,并在数据访问层中实现(类似于如何实现存储库)。或者Authenticator可以成为内部使用存储库的域服务。身份验证者还可以在'用户未找到'或'密码无效'之间进行判断,这可能具有不同的商业含义。