6

我正在将代码移出App_Code类库。

我使用Membership.CreateUser.

如何在无法访问我已配置的成员资格提供程序的类库中继续执行此操作web.config

4

4 回答 4

4

在我向您展示代码部分的工作原理之前 - 您需要了解在这种情况下如何加载设置。

当您有一个要加载.dll文件的 Web 应用程序 - 并且该.dll文件要访问MembershipProvider应用程序配置的文件时 - 您必须做出一些假设。

  1. Web 应用程序有一个MembershipProvider
  2. Web 应用程序MembershipProvider在其Web.Config
  3. .dllWeb 应用程序正确加载您的

因为您的.dll文件应该包含在 Web 应用程序的/bin目录中,所以您应该能够依赖Web 应用程序的配置,而不必提供您自己的配置。

为此,请从 Oded 在他的回答中提到的内容开始 -System.Web.Security在您.dll的代码中创建一个引用 - 然后在该文件中您可以执行以下操作:

if (Membership.Provider != null) {
    Membership.Provider.CreateUser( ... );
} else {
    // Do something appropriate in a case where there is no Membership Provider
}

此时 - 如果上述方法不起作用,很可能是因为您的 Web 应用程序没有配置适当的提供程序。

关于为什么要这样做的说明...

您应该让 Web 应用程序提供配置的原因是为了遵守关注点分离的原则。这MembershipProvider是一个提供默认功能的抽象类 - 几乎没有实现。

换句话说 - 它定义了要管理成员,您需要能够执行诸如CreateUser()和之类的操作GetAllUsers()。它还说您应该能够配置设置,例如指定 aPasswordFormat并确定每个用户是否RequiresUniqueEmail.

它不会告诉您在哪里存储您的用户信息。它留给实现者(System.Web.Providers.DefaultMembershipProviderYourNS.YourMembershipProvider)。

然后使用的应用程序MembershipProvider确定要提供什么设置以及要使用哪个实现。换句话说 -YourNS.YourMembershipProvider指定如何管理信息是一项工作,但很可能是应用程序应该确定ConnectionString在其存储中使用什么等。

所以 - 按照我上面概述的模式,您可以提供三个单独的层:

  1. 一个将消耗MembershipProvider,
  2. 提供MembershipProvider实现的程序集,以及
  3. 使用任何MembershipProvider配置的程序集 - 并代表应用程序对其进行处理(*这是您在帖子中描述的层,我相信)

请注意,如果您遵循此模式 - 您现在可以MembershipProviders稍后切换而无需更改任何其他层- 因为这些层依赖于基类MembershipProvider- 而不是依赖于您的特定实现。这可能非常有价值。

于 2012-12-19T19:41:18.833 回答
1

我通过将整个 web.config 复制到我的 app.config 来解决我的问题。我正在使用控制台应用程序。我以为我已经复制了必要的部分,但是在复制所有内容之前,数据没有进入数据库

于 2012-12-17T01:50:48.427 回答
0

在类的命名空间中添加 using 指令System.Web.Security​​- 这将使您可以直接访问Membership该类。

C#:

using System.Web.Security;

VB.NET:

Imports System.Web.Security
于 2012-10-27T12:38:29.700 回答
0

您可以在任何地方访问它,因为 Membership 类是 ASP.NET 提供程序系统设置的当前提供程序的静态表示。

于 2012-10-27T12:40:33.417 回答