2013-02-12 44 views
2

我正在实现一个自定义ASP.NET角色提供程序,我想知道如果用户传入的用户已经在传入的角色中,它的AddUsersToRoles方法是否应该抛出ProviderException。默认的Microsoft SQL Server角色提供程序SqlRoleProvider会显示此行为,即使official Microsoft documentation不推荐它:我的自定义RoleProvider应该在AddUsersToRoles中引发异常吗?

异常详细信息:System.Configuration.Provider.ProviderException:用户“myTestUser”已经在角色“myTestRole”。

我认为这对我的提供者不会在这种情况下抛出异常是有用的,但只是在给定用户已经在给定的角色时继续前进;这样的调用代码不需要担心重复。但是,在这种情况下是否会存在依赖于异常的现有角色提供程序使用代码?如果有的话,是否应该这样做,因为微软自己似乎不推荐它?

如果我要实现类似AddUsersToRoles的方法,当用户已经在一个角色不抛出异常,我可以看到3个备选方案:

  1. 实现它为AddUsersToRoles,只是有与默认SqlRoleProvider不同的行为。
  2. 在我的角色提供者类中将其作为新的EnsureUsersInRoles方法实现,并使用((MyProvider)(Roles.Provider)).EnsureUsersInRoles()从我的调用代码中访问它。
  3. 只需在一个完全独立的类中实现它。

回答

0

我最终走下了路线2),我在我的问题中提出了;我使用其他一些方法实现了RoleProvider,然后使用cast ((MyProvider)(Roles.Provider))访问我的其他方法,其中一个方法是EnsureUsersInRoles(),它具有我的调用代码所需的非异常抛出功能。

0

就我个人而言,我会遵循微软的做法。这将很难排除某些地方确实需要抛出异常的可能性。

+0

那么如果能够打电话我可以使用它不会抛出异常? – Jez 2013-02-12 20:53:35

+0

我在想这个。尽管我同意预先检查你的用户是否已经在角色中是额外的工作,但我认为MS中的模式非常清晰:“AddWhatever”如果无法添加,则会引发错误。反思我认为这很好,因为至少你知道你在哪里,而不像“沉默失败”,这可能是因为该项目已被添加,但可能是因为某些事情是错误的。 (请参阅下一条评论) – 2013-02-12 21:03:20

+0

如果您需要添加某种方法(如果丢失了某些内容但未抛出异常),请考虑调用该方法“EnsureUsersInRoles”。这样你就可以得到你想要的行为,但不会引入打破现有模式的方法。 – 2013-02-12 21:04:20

相关问题