处理应用程序中的不同用户类型
Handling different user types in an application
我贡献的许多 Web 应用程序(主要是 ASP.NET)需要处理多种不同的用户类型。
假设您有一个学校门户网站,学生和老师每天都使用它。在应用程序的首页上,用户会看到几乎相同的 GUI,除了一些只有教师可以访问的工具的链接。假设这是一个消息传递工具。教师可以有不同的角色,这些角色定义了教师可以发送给谁。
例如:
- 允许角色为
Publisher
的老师发送给学校的每个人。
- 没有额外角色的老师只能发送给 his/her 类 中的所有人。
- 将来,parents 也可以访问此门户并查看有关其 children 的详细信息。
我经常遇到的问题是,在整个应用程序中处理不同的用户类型时,我的代码总是被 if
语句弄得乱七八糟。不仅因为用户类型不同,而且还受到不同业务规则的影响。我觉得我找不到任何方法来正确处理不同的用户类型。
我想 ASP.NET 中的角色概念可以解决这个问题,但您仍然会在应用程序周围得到 if
语句。
我的问题是:是否有关于如何在应用程序中处理不同的 users/user 类型而不用 if
语句感染代码的任何 best-practice?
您应该拆分这些职责(例如教师的发送功能)。您可以使用策略模式来做到这一点。
所以老师有一个额外的属性发布,作为一个接口。该实现可以有多个实现(例如,没有发布功能的教师的 NoPublishing,或 DefaultPublishing)。每个教师都可以将其 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 不需要任何有关 Teacher 的知识,因此测试更容易。
- 可以实时更改教师中的发布行为。
(注意:我这里没有编译器,所以代码只是为了解释)。
我贡献的许多 Web 应用程序(主要是 ASP.NET)需要处理多种不同的用户类型。
假设您有一个学校门户网站,学生和老师每天都使用它。在应用程序的首页上,用户会看到几乎相同的 GUI,除了一些只有教师可以访问的工具的链接。假设这是一个消息传递工具。教师可以有不同的角色,这些角色定义了教师可以发送给谁。
例如:
- 允许角色为
Publisher
的老师发送给学校的每个人。 - 没有额外角色的老师只能发送给 his/her 类 中的所有人。
- 将来,parents 也可以访问此门户并查看有关其 children 的详细信息。
我经常遇到的问题是,在整个应用程序中处理不同的用户类型时,我的代码总是被 if
语句弄得乱七八糟。不仅因为用户类型不同,而且还受到不同业务规则的影响。我觉得我找不到任何方法来正确处理不同的用户类型。
我想 ASP.NET 中的角色概念可以解决这个问题,但您仍然会在应用程序周围得到 if
语句。
我的问题是:是否有关于如何在应用程序中处理不同的 users/user 类型而不用 if
语句感染代码的任何 best-practice?
您应该拆分这些职责(例如教师的发送功能)。您可以使用策略模式来做到这一点。
所以老师有一个额外的属性发布,作为一个接口。该实现可以有多个实现(例如,没有发布功能的教师的 NoPublishing,或 DefaultPublishing)。每个教师都可以将其 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 不需要任何有关 Teacher 的知识,因此测试更容易。
- 可以实时更改教师中的发布行为。
(注意:我这里没有编译器,所以代码只是为了解释)。