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

C# 在应用程序中处理不同的用户类型,c#,asp.net,identity,C#,Asp.net,Identity,我参与的许多web应用程序(主要是ASP.NET)都需要处理多种不同的用户类型 假设你有一个学校门户,学生和老师每天都在使用。在应用程序的首页上,用户会看到几乎相同的GUI,除了一些指向只有教师才能访问的工具的链接。假设这是一个消息传递工具。教师可以有不同的角色,这些角色定义了教师可以发送给谁 例如: 具有发布者角色的教师可以发送给学校的每个人 没有额外角色的教师只允许发送给他/她的班级中的每个人 将来,家长还可以访问此门户,查看有关其子女的详细信息 我经常遇到的问题是,在整个应用程序中处理

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

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

例如:

  • 具有发布者角色的教师可以发送给学校的每个人
  • 没有额外角色的教师只允许发送给他/她的班级中的每个人
  • 将来,家长还可以访问此门户,查看有关其子女的详细信息
我经常遇到的问题是,在整个应用程序中处理不同的用户类型时,我的代码总是被
if
-语句弄得乱七八糟。不仅因为不同的用户类型,还因为不同的业务规则。我觉得我找不到任何方法来正确处理不同的用户类型

我想ASP.NET中的角色概念可以解决这一问题,但在应用程序中仍然会出现
if
-语句


我的问题是:对于如何在应用程序中处理不同的用户/用户类型而不使代码受到
if
-语句的影响,是否有任何最佳实践?

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

因此,教师有一个额外的属性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等)

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

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

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

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

如果您为每个用户类型拥有不同的类,您将使用行为“装饰”类(使用接口完成吗?)这将赋予他们出版等属性?恐怕我没有正确理解你的问题。我的问题是:你将如何实现这一点?假设每种用户类型都有不同的C#类。什么会让他们有这种行为,例如出版?我想这可以通过查看策略模式来回答,但是如果你能勾勒出代码的样子,那就太好了。为什么我们不能让老师来实现这个接口呢?非常感谢!我去看看。