处理应用程序中的不同用户类型

本文关键字:用户 类型 应用程序 处理 | 更新日期: 2023-09-27 18:26:50

我参与的许多web应用程序(主要是ASP.NET)都需要处理多种不同的用户类型。

假设你有一个学校门户网站,学生和老师每天都在使用。在应用程序的首页上,用户会看到几乎相同的GUI,除了一些只有教师才能访问的工具的链接。假设这是一个消息传递工具。一个教师可以有不同的角色,这些角色定义了教师可以派谁去。

例如:

  • 允许将角色为Publisher的教师发送给学校中的每个人
  • 没有额外角色的老师只允许派给他/她的班上的每个人
  • 将来,家长们也可以访问这个门户网站,查看孩子的详细信息

我经常遇到的问题是,在整个应用程序中处理不同的用户类型时,我的代码总是被if语句弄得一团糟。不仅因为用户类型不同,还因为业务规则不同。我觉得我找不到任何方法来正确处理不同的用户类型。

我想ASP.NET中角色的概念在某种程度上解决了这个问题,但您最终还是会在应用程序中使用if语句。

我的问题是:对于如何在应用程序中处理不同的用户/用户类型而不使用if-语句感染代码,有什么最佳实践吗?

处理应用程序中的不同用户类型

您应该划分这些职责(例如,教师的发送功能)。您可以使用策略模式来实现这一点。

因此,教师有一个额外的属性Publishing,它充当一个接口。该实现可以有多种实现(例如,对于没有发布功能的教师,不发布,或默认发布)。每个教师的Publishing属性都可以设置为NoPublishing或DefaultPublishing。如果需要,它甚至可以在运行时更改。

一个例子:

public class Teacher
{
   public IPublishing Publishing { get; }
}
interface IPublishing 
{
   void Send();
}
public NoPublishing : IPublishing
{
  public void Send() 
  {
     // Implementatation
  }
}
public PublishDefault : IPublishing
{
  public void Send()
  {
    // Send a message the default way
  }
}

创建教师:

var teacher = new Teacher();

创建发布者策略。

var defaultStrategy = new PublishDefault();

连接他们

teacher.Publishing = defaultStrategy;

现在您可以通过以下方式发送消息:

teacher.Publishing.Send();

根据已连接的发布策略,它将不发送任何内容或以默认方式发送某些内容。

您只需要实例化每个使用过的发布策略一次,并为每个教师(甚至其他需要发送的类)重用它。

当您需要其他发布功能时,只需添加一个新策略(例如SmsPublishing、LetterPublishing等)。

如果需要,您甚至可以随时更改策略(通过重新分配"发布"属性)。

为什么不直接在Teacher中实现接口

  • 关注点分离原则:IPublish包含一项具体而不同的责任
  • IPublish可能包含稍后可以在不同类甚至其他项目中使用的功能,因此它更具可重用性
  • 由于IPublish不需要任何关于教师的知识,因此测试更容易
  • 实时改变教师出版行为的可能性

(注意:我这里没有编译器,所以代码仅用于解释目的)。