DDD:存储库可以返回布尔值吗?

时间:2011-09-15 18:07:49

标签: language-agnostic domain-driven-design repository repository-pattern ddd-repositories

Repository是否可以根据它(虚拟)包含的对象返回布尔值?

例如:

if (userRepository.checkCredentials(username, password))
{
    // ...

或者以冗长的方式做到这一点是更好的方法:

user = userRepository.findByUsername(username);
if (user != null && user.checkPassword(password)) {
{
    // ...

2 个答案:

答案 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可以成为内部使用存储库的域服务。身份验证者还可以在'用户未找到'或'密码无效'之间进行判断,这可能具有不同的商业含义。