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)
听起来更像规范不是吗?
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)
存储库是一种用于封装存储、检索和搜索行为的机制,它模拟对象的集合。
我认为从存储库返回布尔值是可以的,但前提是该方法涉及此存储库中的所有对象。存储库通常公开类似集合的接口。例如users.IsEmpty()或users.IsNameUnique("jdoe")看起来合乎逻辑,因为他们需要访问整个集合。
在您的场景中,仅按名称查找用户是可以分配给存储库的责任。检查密码是否有效似乎不太适合存储库。因此,第二种更详细的方法对我来说似乎更好。
或者,您可以在域中拥有专用的身份验证器接口,并在数据访问层中实现(类似于存储库的实现方式)。或者Authenticator可以成为内部使用存储库的域服务。身份验证器还可以区分“未找到用户”或“密码无效”,这可能具有不同的业务含义。