如何调用角色提供程序的自定义方法?

时间:2012-10-31 20:18:44

标签: c# roleprovider

好的,我已经创建了自定义角色提供程序并将其添加到web.config中。这是我的角色提供者代码的一部分:

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

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

当我需要在我的应用程序中使用角色提供程序时,我会这样称呼它:

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

好的,太棒了!它调用我的自定义代码(我可以通过调试告诉)并且每次都返回true。为什么我不能在我的自定义角色提供程序上进行以下调用?

var no_compile = Roles.MyCustomFunction();

如何让我的自定义角色提供程序的所有公共成员都可以访问?

2 个答案:

答案 0 :(得分:2)

我真的不知道是什么问题,但你应该能够做到

var no_compile = _Roles.MyCustomFunction();

如果_Roles定义了新的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.Roles不包含MyCustomFunction()的定义,那是因为您没有在类中定义新函数

  • MyCustomRoleProviderSystem.Web.Security.Roles是两个具有不同功能的不同类

System.Web.Security.Roles contains a definition for IsUserInRole(string username, string roleName) (+1 overload)

请注意:您无法修改或添加System.Web.Security.Roles函数,因为它是写保护的

System.Web.Security.Roles is write protected

谢谢, 我希望你觉得这很有帮助:)

答案 1 :(得分:2)

原因是Roles.IsUserInRole是一个静态方法,它有一个实现来选择当前RoleProvider并执行它的IsUserInRole 实例方法。内部使用的类型不是MyCustomRoleProvider类型,而是RoleProvider。这实际上就是这个问题:

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();
    }
}