【问题标题】:Should my custom RoleProvider throw an exception in AddUsersToRoles?我的自定义 RoleProvider 是否应该在 AddUsersToRoles 中引发异常?
【发布时间】:2013-02-15 03:15:57
【问题描述】:

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

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

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

如果我确实想实现类似于AddUsersToRoles 的方法,当用户已经在某个角色中时不会引发异常,我可以看到 3 种替代方法:

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

【问题讨论】:

    标签: asp.net exception roleprovider


    【解决方案1】:

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

    【讨论】:

    • 那么我可以使用不会引发异常的调用呢?
    • 我在想这个。虽然我同意预先检查您的用户是否还没有担任角色是一项额外的工作,但我认为 MS 内容中的模式非常清楚:如果“AddWhatever”无法添加某些内容,则会引发错误。仔细想想,我认为这很好,因为至少你知道你在哪里,不像“静默失败”,这可能是因为该项目已经添加,但也可能是因为出现了问题。 (见下一条评论)
    • 如果您需要一种在缺少某些内容时添加但不引发异常的方法,请考虑调用该方法“EnsureUsersInRoles”。这样,您将获得您想要的行为,但不会引入破坏现有模式的方法。
    • 那么该方法将何去何从? RoleProvider 中没有这样的方法。
    • 我认为选项 2 或 3(在上面的问题修改中)都是不错的选择。我实际上有点喜欢 3,因为我不喜欢将基类型转换为更派生的类型以获取附加功能:假设您知道抽象类型参数的实际类型将始终是那种假设回来咬你。
    【解决方案2】:

    我最终走上了我在问题中提出的路线 2);我还用一些额外的方法实现了RoleProvider,然后使用强制转换((MyProvider)(Roles.Provider)) 来访问我的其他方法,其中一个是EnsureUsersInRoles(),它具有我的调用代码的非抛出异常功能想要。

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 2021-09-09
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2010-11-18
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多