3

OK, I've created my custom role provider and added it to the web.config. Here's part of my code for the role provider:

public class MyCustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        return true;
    }

    public string MyCustomFunction()
    {
        return "its my custom string";
    }
}

When I need to use the role provider in my application, I'll call it like this:

var truth = Roles.IsUserInRole("myUsername", "myFakeRole");

OK, Great!, it calls my custom code (I can tell from debugging) and returns true every time. Why can I not make the following call on my custom role provider?

var no_compile = Roles.MyCustomFunction();

how can I make all public members of my custom role provider accessible?

4

2 に答える 2

2

何が問題なのかよくわかりませんが、できるはずです

var no_compile = _Roles.MyCustomFunction();

関数が public であるため_Roles、 new を定義する場合MyCustomRoleProvider

MyCustomRoleProvider _Roles = new MyCustomRoleProvider();
var no_compile = _Roles.MyCustomFunction();

MyCustomRoleProvider.MyCustomFunction()ではないため、直接呼び出すことはできませんpublic static string


:System.Web.Security.Rolesはクラスと同じ関数名を含むクラスIsUserInRole(string username, string roleName)ですが、関数は両方のクラスで同じではないことに注意してください。したがって、クラスに定義が含まれていないRoles.MyCustomFunction()ため、アクセスできません。それは、クラスで新しい関数を定義していないためです。System.Web.Security.RolesMyCustomFunction()

  • MyCustomRoleProviderそして、System.Web.Security.Roles異なる機能を持つ2つの異なるクラスです

System.Web.Security.Roles には IsUserInRole(string username, string roleName) の定義が含まれています (+1 オーバーロード)

書き込みSystem.Web.Security.Roles保護されているため、機能を変更または追加することはできません

System.Web.Security.Roles は書き込み保護されています

ありがとう、
これがお役に立てば幸いです:)

于 2012-10-31T20:27:05.693 に答える
2

その理由は、現在のインスタンスメソッドを選択して実行する実装を持つ静的メソッドであるRoles.IsUserInRoleためです。内部で使用されている型は型としてではなく、 . それは事実上この問題です:RoleProviderIsUserInRole MyCustomRoleProviderRoleProvider

public class BaseClass
{
    public virtual void Foo() { }
}

public class DerivedClass
{
    public virtual void Foo() { }

    public void MoreFoo() { }
}

BaseClass instance = new DerivedClass();
instance.MoreFoo(); // Doesn't compile

このクラスは、派生バージョンですが、基本型として使用されているため、カスタム プロバイダーに実装されていることを認識していません。

アクセス可能にするために、必要なすべての呼び出しを内部的に実行できる独自の静的実装を作成できます。

public static class Roles
{
    protected static Lazy<MyCustomProvider> _provider = new Lazy<MyCustomProvider>(() => System.Web.Security.Roles.Provider);

    public static MyCustomProvider Provider { get { return _provider.Value; } }

    public static IsUserInRole(string userName, string roleName)
    {
        return _provider.Value.IsUserInRole(userName, roleName);
    }

    public static MyCustomFunction()
    {
        return _provider.Value.MyCustomFunction();
    }
}
于 2012-10-31T21:23:08.503 に答える