2013-05-08 82 views
0

我想设计一个模块来支持我的应用程序(C#)中的用户身份验证和管理。此模块应作为用于基础结构活动的DLL的一部分提供,以便其他开发人员需要将其用作“第三方”组件。这里的要点是,我不负责UI(取决于用户权限和会话),但只提供基础设施。属性缓存和更新

所以我创建了一个UserManager singleton类,它允许登录,注销等几个函数和事件。 UserManager类包含一个名为CurrentUser的属性,其类型为ApplicationUser

ApplicationUser是与用户的详细信息(如全名,用户名和类似的东西)创建的类,并且还提供了一个IsEligibleFor(Permission)函数。

我希望用户获得UserManager实例,并通过CurrentUser属性与当前登录用户通信。 当一个注销操作被调用时,理想的方法是取消CurrentUser,并且每次用户登录时创建一个新的ApplicationUser。但是这是有问题的,因为这些类的用户能够缓存ApplicationUser的实例,而不会注意到这种变化。

这就是为什么我想转移到ApplicationUser对象中有一个标志的解决方案,该标志指示对象是否仍然有效。但是这需要检查ApplicationUser的每种方法的有效性,我不喜欢这种方法。

我想知道是否有某种解决方案或模式我在这里失踪。

回答

0

听起来像Observer pattern是你的后。这些类将观察UserManager类,然后随后通知每当有变化。

他们可以侦听特定更改,因此在您的方案中,他们可以侦听对象何时发生更改,然后可以放弃旧副本并缓存新副本。

在实现方面,使用.NET可以很容易地使用事件来实现它。

+0

这个“解决方案”被认为是的(我确实会让用户订阅logoout的事件),但我仍然在寻找一个解决方案,将承担用户重新缓存的责任。在你的解决方案中,我将把CurrentUser设置为null,但用户仍然可以混淆旧版本,而不知道它是旧版本。 – 2013-05-08 13:04:50

+0

缓存用户不是聆听者的责任吗?您可以将新用户和事件一起发送,并且侦听器基本上只会将其缓存的用户对象替换为随事件一起发送的对象。 “*用你的解决方案,我将CurrentUser设置为null,但用户仍然可以混淆旧的副本*” - 不,他们不会这样做,因为你会用新的副本替换旧的副本。我可能误解你当前的设置是什么样子,可能更适合你通过一个工作示例更新你的问题。 – James 2013-05-08 13:06:41

+0

我希望用户使用这个类,而不需要担心重新缓存问题。我想确保没有我失踪的机制。谢谢:) – 2013-05-08 13:11:11