2015-12-14 94 views
5

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

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

例如:

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

我总是会遇到的问题是,在整个应用程序中处理不同用户类型时,我的代码始终与if -statements混淆。不仅因为不同的用户类型,而且还因为不同的业务规则。我觉得我找不到任何方法来正确处理不同的用户类型。

我猜ASP.NET中的角色概念解决了这个问题,但是你仍然会以if结束 - 在应用程序周围的陈述。

我的问题是:是否有任何关于如何处理应用程序中不同用户/用户类型的最佳做法,而不会感染具有if-声明的代码?

回答

2

你应该分开这些责任(例如老师的发送能力)。你可以通过使用策略模式来做到这一点。

因此,老师有一个额外的财产出版,作为一个接口。该实现可以有多个实现(例如,对于没有发布功能的教师或DefaultPublishing,NoPublishing)。每位教师可以将其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不需要关于教师的任何知识,所以测试更容易。
  • 实时更改教师发布行为的可能性。

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

+0

如果你对每个用户类型有不同的类,你会用行为(用接口完成)来“装饰”类,这会给他们发布等的属性。 –

+0

恐怕我不能正确理解你的问题。 –

+0

我的问题是:你会如何实现这一点?假设您为每种用户类型都有不同的C#类。什么会给他们这种行为,例如发布?我想这是通过查看策略模式来回答的,但如果您能够勾画出代码的外观,这将非常可爱。 –

相关问题