我有一个对话框,身份验证对话框,在我的应用程序的不同部分将需要。在程序的不同点上能够有效地调用对话框及其背后的逻辑(单独的类)会是什么样的最佳设计实践?
EG:
用户启动程序 - 需要登录
用户想查看加密数据 - 确认所需密码
用户想要更改密码 - 确认当前需要的密码。
那么实现这个的好方法是什么?
欢迎任何建议?
答案 0 :(得分:1)
一种方法可能是创建“用户身份验证”方法。
因此,当您需要检查是否允许用户执行请求的操作时,您可以进行呼叫:
if (UserAuthenticated())
{
// Perform action
}
此方法将保存用户的详细信息并提示输入密码,并针对数据库进行检查。如果详细信息匹配,请返回true
并继续。
启动时,不会设置用户名,因此对话框也可以提示用户名。
答案 1 :(得分:1)
也许不是最简单的实现方案,但您可以考虑使用面向方面编程。然后,您可以注释需要用户登录的每个方法。这使代码清晰可读。
[ConfirmUser(ErrorMethod=... RequireUsername=false, RequirePassword=true )]
public void ViewData()
{
// your code
}
AOP框架将编织所需的代码以处理方法中的用户确认。
或者手动在方法中做同样的事情:
public void ViewData()
{
ConfirmUser();
// your code
}
public void ConfirmUser()
{
if( !DoLoginPage() ) throw new SecurityException("Incorrect credentials");
}
您可以让ConfirmUser返回bool而不是异常。这是另一个讨论,取决于您的应用程序。如果您拒绝在较低代码层中进行操作,则可以采用例外方式。 try / catch使你将错误处理放在函数的底部,而返回的bool需要和if语句在顶部。
public void ViewData()
{
try
{
ConfirmUser();
// your code
}
catch( SecurityException )
{
//handle error
}
}
VS
public void ViewData()
{
if( !ConfirmUser() )
{
//handle error
return;
}
// your code
}
您可以同时实施ConfirmUser和ConfirmPassword,也可以使用相同的方法使用参数,也可以使用枚举来说明您需要验证的内容。
[Flags]
public enum Requires
{
Username,
Password
}
public bool ConfirmUser( Requires requiresField )
{
}
答案 2 :(得分:0)
一般来说,与设计任何其他可重用类相比,设计可重用表单没有真正的区别 - 将要重用的类放入一个或多个程序集中,并从要重用它们的位置引用它们。这适用于Forms以及任何其他可重用的类。
如果您需要稍微不同的表单功能,具体取决于您调用它的上下文,您可以编写适当的构造函数,或者在显示之前通过适当的方法初始化对话框。