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

Ben*_*min 4 language-agnostic domain-driven-design repository ddd-repositories repository-pattern

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

例如:

if (userRepository.checkCredentials(username, password))
{
    // ...
Run Code Online (Sandbox Code Playgroud)

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

user = userRepository.findByUsername(username);
if (user != null && user.checkPassword(password)) {
{
    // ...
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 7

听起来更像规范不是吗?

if (canAuthenticateSpec.isSatisfiedBy(username, password))
Run Code Online (Sandbox Code Playgroud)

在过去,我已经使用规范进行了此操作,因此我可以清楚而简单地检查我的代码以供使用.

但是,最近,我使用一项服务来完成这项工作,并根据他们未进行身份验证的原因构建结果.所以,像这样的东西:

AuthenticateResult result = slAuthenticator.Authenticate(username, password)
if (result.authenticated) {
    user = result.user
} else {
    String message = result.failureReason; 
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 5

存储库是一种用于封装存储、检索和搜索行为的机制,它模拟对象的集合

我认为从存储库返回布尔值是可以的,但前提是该方法涉及此存储库中的所有对象。存储库通常公开类似集合的接口。例如users.IsEmpty()users.IsNameUnique("jdoe")看起来合乎逻辑,因为他们需要访问整个集合。

在您的场景中,仅按名称查找用户是可以分配给存储库的责任。检查密码是否有效似乎不太适合存储库。因此,第二种更详细的方法对我来说似乎更好。

或者,您可以在域中拥有专用的身份验证器接口,并在数据访问层中实现(类似于存储库的实现方式)。或者Authenticator可以成为内部使用存储库的域服务。身份验证器还可以区分“未找到用户”或“密码无效”,这可能具有不同的业务含义。