程序的不同部分需要对话 - 设计

时间:2009-12-27 12:58:34

标签: c# design-patterns

我有一个对话框,身份验证对话框,在我的应用程序的不同部分将需要。在程序的不同点上能够有效地调用对话框及其背后的逻辑(单独的类)会是什么样的最佳设计实践?

EG:

用户启动程序 - 需要登录

用户想查看加密数据 - 确认所需密码

用户想要更改密码 - 确认当前需要的密码。

那么实现这个的好方法是什么?

欢迎任何建议?

3 个答案:

答案 0 :(得分:1)

一种方法可能是创建“用户身份验证”方法。

因此,当您需要检查是否允许用户执行请求的操作时,您可以进行呼叫:

if (UserAuthenticated())
{
    // Perform action
}

此方法将保存用户的详细信息并提示输入密码,并针对数据库进行检查。如果详细信息匹配,请返回true并继续。

启动时,不会设置用户名,因此对话框也可以提示用户名。

这是aspect orientated programmingcross-cutting concerns的示例。

答案 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以及任何其他可重用的类。

如果您需要稍微不同的表单功能,具体取决于您调用它的上下文,您可以编写适当的构造函数,或者在显示之前通过适当的方法初始化对话框。