2

バックグラウンド

完全に機能する ASP.net MVC アプリケーション用のカスタム メンバーシップとロール プロバイダーがあります。ただし、最近の要件により、Role プロバイダーを変更して、いくつかの追加機能を許可する必要があります。

デフォルトのプロバイダー (1 人のユーザーが多くのロールを持つことができ、それだけです) とは異なり、私の新しい要件では、ユーザーが会社ごとに異なるロールのコレクションを持つ必要があります。したがって、ある会社ではユーザー アカウントに管理者権限があり、別の会社ではそのアカウントに標準ユーザー権限しかない場合があります...これを可能にするために、既存の usersinrole テーブルを、アプリケーション データに直接結び付けられる追加の 2 に置き換えています。構造と既存の users テーブル。

2 つの追加のテーブルと、それらがスキーマにどのように適合するかを次に示します。

追加のテーブル

原則として、これはまさに私が必要とすることを行いますが、カスタム ロール プロバイダーの関数の一部を変更して、会社ごとのユーザーのロールのチェックを有効にするパラメーターを含める必要があります。

これらの変更を行い、追加のパラメーターを追加しようとすると、次のエラーが表示されます。

'Public Overrides Function IsUserInRole(username As String, rolename As String, [companyID As Integer = 0]) As Boolean' cannot override 'Public MustOverride Function IsUserInRole(username As String, roleName As String) As Boolean' because they differ by optional parameters.

質問

カスタム ロール プロバイダはデフォルトの RoleProvider クラスから継承するため、これは理にかなっています。

4

1 に答える 1

0

ルールOverridesと呼ばれるセクションのドキュメントは、次のことを示しています。

一致する署名。

この宣言の署名は、オーバーライドするプロパティまたはプロシージャの署名と正確に一致する必要があります。つまり、パラメーター リストには、同じ数、同じ順序、同じデータ型のパラメーターが含まれている必要があります。署名に加えて、オーバーライド宣言も次のものと完全に一致する必要があります。

  • アクセスレベル
  • 戻り値の型 (ある場合)

この硬直性はおそらく、別の名前 (おそらくIsUserInRoleForCompany) を使用してメソッドをコーディングし、コードをリファクタリングして、 ではなくそのメソッドを呼び出す必要があることを意味しますIsUserInRole。理想的ではありませんが、新しいパラメーターを追加するには、とにかくすべての呼び出しをリファクタリングする必要がありました。

別の方法として、現在のユーザーの CompanyID を、キャッシュ (または Cookie など) からその値を取得して使用できるようにキャッシュすることを検討することもできますIsUserInRole。剛性の問題あたり。

それが役立つことを願っています。

于 2013-05-19T05:37:06.227 に答える