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

时间:2015-12-14 09:03:21

标签: c# asp.net identity

我所贡献的许多Web应用程序(主要是ASP.NET)需要处理多种不同的用户类型。

我们假设您有一个学校门户网站,学生和老师每天都会使用。在应用程序的首页上,除了一些只有教师可以访问的工具的链接外,用户才会遇到几乎相同的GUI。让我们说这是一个消息传递工具。教师可以有不同的角色来定义教师可以发送给谁。

例如:

  • 允许具有Publisher角色的教师发送给学校中的每个人。
  • 只允许没有额外角色的老师发送给他/她班级中的每个人。
  • 将来,家长也可以访问此门户网站并查看有关其子女的详细信息。

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

我想ASP.NET中角色的概念解决了这个问题,但你仍然会在应用程序周围使用if - 语句。

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

1 个答案:

答案 0 :(得分:2)

您应该分担这些职责(例如教师的发送功能)。您可以使用策略模式来完成此操作。

因此,教师有一个额外的属性Publishing,它作为一个界面。该实现可以具有多个实现(例如,对于没有发布功能的教师或者DefaultPublishing的NoPublishing)。每个教师都可以将其发布属性设置为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等)。

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

为什么不直接在教师中实现界面?

  • 分离关注原则:IPublish包含特定且不同的责任。
  • 可能是IPublish包含以后可以在不同类甚至其他项目中使用的功能,因此它更具可重用性。
  • 测试更容易,因为IPublish不需要任何关于教师的知识。
  • 实时改变教师发布行为的可能性。

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