【发布时间】:2020-04-22 15:58:39
【问题描述】:
我有一个登录用户的场景。如果验证返回成功消息,我编写此代码用于检查用户。
我正在使用链式责任模式进行此验证,但它看起来很难看,因为我需要更多 new 在此类中。
现在我想编写干净的最佳实践来使用这种模式。
我该怎么做?
public abstract class ValidateUser
{
protected readonly ValidateUser _validateUser;
public ValidateUser(ValidateUser validateUser)
{
_validateUser = validateUser;
}
public abstract UserContext ValidateUserLogin(UserContext request);
}
CheckIsActive:
public class CheckIsActive : ValidateUser
{
public CheckIsActive(ValidateUser validateUser) : base(validateUser)
{
}
public override UserContext ValidateUserLogin(UserContext request)
{
if (request.Context.IsActive)
{
return _validateUser.ValidateUserLogin(request);
}
return new UserContext
{
Message = "User Not Active"
};
}
}
CheckPhoneConfirmed:
public class CheckPhoneConfirmed : ValidateUser
{
public CheckPhoneConfirmed(ValidateUser validateUser) : base(validateUser)
{
}
public override UserContext ValidateUserLogin(UserContext request)
{
if (request.Context.ConfirmPhoneNumber)
{
return _validateUser.ValidateUserLogin(request);
}
return new UserContext
{
Message="Phone Number Not confirmed"
};
}
}
CheckIsLockedAccount:
public class CheckIsLockedAccount : ValidateUser
{
public CheckIsLockedAccount(ValidateUser validateUser) : base(validateUser)
{
}
public override UserContext ValidateUserLogin(UserContext request)
{
if (!request.Context.IsLockedEnd)
{
return new UserContext
{
Context = request.Context
};
}
return new UserContext
{
Message = $"Your account is deactivated from to date {request.Context.LockedEnd}"
};
}
}
我通过这种方式使用这个Validate:
var validate = new CheckIsActive(new CheckPhoneConfirmed(new CheckIsLockedAccount(null)));
var validateUserContext = validate.ValidateUserLogin(new UserContext
{
Context = findUSer.Result,
Message = null
});
【问题讨论】:
-
可以添加一系列中间件。
-
没有更多信息,感觉这里有点过分了。您基本上是在尝试验证用户,这表明您应该创建单独的方法而不是具体的类。甚至您的具体类的名称也指向它们不是真正的类。如果您有一个链,其中您有一个 UserHandler 验证用户,然后将其传递给 RoleHandler 之类的东西,以计算出将其传递给 OrderHandler 或其他东西的权限,您可能会做这样的事情。
-
@sr28 你对这项工作有更好的想法吗?
标签: c# asp.net design-patterns