0

这只是在不久前发生在我身上。在我的代码中,我需要获取Roles指定的用户。

这是我的代码中的内容:

string[] roles = {};
SqlRoleProvider fxSRP = new SqlRoleProvider();

string id = Request.QueryString["UserName"] as string;

string userName = id;

现在这一切都很好,但是当我谈到这一点时:

roles = fxSRP.GetRolesForUser(userName);

系统抛出了那个该死的Object reference not set to an instance of an object异常。老实说,让我发疯了几分钟。但是,当我将一小段代码更改为此(这是一个显式调用,对吗?):

roles = Roles.GetRolesForUser(userName);

该代码有效。我可以Roles为用户检索并使用我想要的。

我想知道,为什么使用GetRolesForUserinstatiatedSqlRoleProvider不起作用?因为这也可能发生在我将要处理的下一段代码中,即使用RemoveUsersFromRolesand AddUsersToRoles。而且,程序在寻找什么样的实例?我没有为该方法工作实例化什么?

4

2 回答 2

1

您正在调用new SqlRoleProvider(),但根据该构造函数的文档, http: //msdn.microsoft.com/en-us/library/system.web.security.sqlroleprovider.sqlroleprovider.aspx

ASP.NET 调用 SqlRoleProvider 构造函数来创建应用程序配置中指定的 SqlRoleProvider 类的实例。此构造函数不打算在您的代码中使用。

(强调我的。)我不是这门课的专家,但我认为这句话表明你不应该尝试这样做。

于 2014-01-09T03:29:11.617 回答
1

尽管@Chris Culter 的建议可能会更好地作为评论,但很有可能如果框架建议不直接实例化对象,那么您可能不应该这样做。这样做可能会跳过实例化对象上的几个重要初始化步骤,这意味着您可能没有为它提供足够好的预期用途。

您偶然发现了推荐的方式来做您所追求的事情,那么为什么还要为不起作用的选项而烦恼(特别是考虑到它明确不推荐)?

如果您以这种方式使用此类特别有什么收获,那么我建议您将相关程序集拉入 ILSpy 或 Reflector 并开始挖掘框架如何使用您的特定用例,以确保您将行为模仿为T。

即使仍然依赖于不推荐的行为,无论它可能多么公开,都非常不鼓励,因为将来可能会在不通知的情况下进行更改。最好取决于类使用方式,而不是小众编译要求。

于 2014-01-09T04:19:16.337 回答