0

尝试在测试中创建用户帐户。但是在运行时获取对象引用并没有设置为对象错误的实例。

这是我的 MemberShip 提供程序类,它位于类库 MyCompany.MyApp.Domain.dll 中:

using System;
using System.Collections.Generic;
using System.Web.Security;

namespace MyCompany.MyApp.Domain
{
    public class MyMembershipProvider : SqlMembershipProvider
    {
        const int defaultPasswordLength = 8;
        private int resetPasswordLength;

        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            resetPasswordLength = defaultPasswordLength;
            string resetPasswordLengthConfig = config["resetPasswordLength"];
            if (!String.IsNullOrEmpty(resetPasswordLengthConfig))
            {
                config.Remove("resetPasswordLength");

                if (!int.TryParse(resetPasswordLengthConfig, out resetPasswordLength))
                {
                    resetPasswordLength = defaultPasswordLength;
                }
            }
            base.Initialize(name, config);
        }

        public override string GeneratePassword()
        {
            return Utils.PasswordGenerator.GeneratePasswordAsWord(resetPasswordLength);
        }
    }
}

这是我的单独测试类库 MyCompany.MyApp.Doman.Test.dll 的 App.Config,它引用了我上面的业务域库:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="SqlServer" connectionString="data source=mycomp\SQL2008;Integrated Security=SSPI;Initial Catalog=myDatabase" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.web>
        <membership defaultProvider="MyMembershipProvider" userIsOnlineTimeWindow="15">
            <providers>
                <clear/>
                <add name="MyMembershipProvider"
                     type="MyCompany.MyApp.Domain.MyMembershipProvider,MyCompany.MyApp.Domain"
                     connectionStringName="SqlServer"
                     applicationName="MyApp"
                     minRequiredNonalphanumericCharacters="0"
                     enablePasswordRetrieval="false"
                     enablePasswordReset="true"
                     requiresQuestionAndAnswer="false"
                     requiresUniqueEmail="true"
                     passwordFormat="Hashed"/>
            </providers>
        </membership>
    </system.web>
</configuration>

这是我抛出“对象引用未设置为对象的实例”的方法

public class MemberTest
    {
        public static void CreateAdminMemberIfNotExists()
        {
            MembershipCreateStatus status;
            status = MembershipCreateStatus.ProviderError;

            MyMembershipProvider provider = new MyMembershipProvider();

            provider.CreateUser("Admin", "password", "someone@somewhere.co.uk", "Question", "Answer", true, Guid.NewGuid(), out status);
        }
    }

它抛出 provider.CreateUser 行

4

3 回答 3

2

我很确定您应该在调用 CreateUser 之前在测试代码中调用 provider.Initialize(...)。

于 2008-10-09T13:06:46.067 回答
1

好吧,并不是所有人都有答案。csgero 是在正确的轨道上虽然初始化是问题。但只是直接调用它并不是一个解决方案。这有效:

public class MemberTest
    {
        public static void CreateAdminMemberIfNotExists()
        {
            MembershipCreateStatus status;
            MembershipUser member = Membership.CreateUser("Admin", "password", "email@somewhere.co.uk", "Question", "Answer", true, out status);
        }
    }

我相信直接实例化我的会员提供程序需要设置通常存储在 app.config 或 web.config 中的配置属性,然后调用初始化。然而,在 Mebership 类上调用静态 CreateUser 方法会导致读取配置,然后解析、加载和初始化配置中指定的类型。

于 2008-10-10T09:46:03.290 回答
0

错误是直接在 provider.CreateUser 上还是在它里面的堆栈的某个地方 - 也许你可以在调用之前检查 null 。

也许缺少依赖关系 - 您是否在路径上获得了相关的 DB dll?

于 2008-10-09T13:00:13.570 回答