我正在将代码移出App_Code
类库。
我使用Membership.CreateUser
.
如何在无法访问我已配置的成员资格提供程序的类库中继续执行此操作web.config
?
我正在将代码移出App_Code
类库。
我使用Membership.CreateUser
.
如何在无法访问我已配置的成员资格提供程序的类库中继续执行此操作web.config
?
在我向您展示代码部分的工作原理之前 - 您需要了解在这种情况下如何加载设置。
当您有一个要加载.dll
文件的 Web 应用程序 - 并且该.dll
文件要访问MembershipProvider
应用程序配置的文件时 - 您必须做出一些假设。
MembershipProvider
MembershipProvider
在其Web.Config
.dll
Web 应用程序正确加载您的因为您的.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.DefaultMembershipProvider
或YourNS.YourMembershipProvider
)。
然后使用的应用程序MembershipProvider
确定要提供什么设置以及要使用哪个实现。换句话说 -YourNS.YourMembershipProvider
指定如何管理信息是一项工作,但很可能是应用程序应该确定ConnectionString
在其存储中使用什么等。
所以 - 按照我上面概述的模式,您可以提供三个单独的层:
MembershipProvider
,MembershipProvider
实现的程序集,以及MembershipProvider
配置的程序集 - 并代表应用程序对其进行处理(*这是您在帖子中描述的层,我相信)请注意,如果您遵循此模式 - 您现在可以MembershipProviders
稍后切换而无需更改任何其他层- 因为这些层依赖于基类MembershipProvider
- 而不是依赖于您的特定实现。这可能非常有价值。
我通过将整个 web.config 复制到我的 app.config 来解决我的问题。我正在使用控制台应用程序。我以为我已经复制了必要的部分,但是在复制所有内容之前,数据没有进入数据库
在类的命名空间中添加 using 指令System.Web.Security
- 这将使您可以直接访问Membership
该类。
C#:
using System.Web.Security;
VB.NET:
Imports System.Web.Security
您可以在任何地方访问它,因为 Membership 类是 ASP.NET 提供程序系统设置的当前提供程序的静态表示。