문제

테스트에서 사용자 계정을 작성하려고합니다. 그러나 객체 참조를 얻는 것은 실행할 때 객체 오류의 Instanve로 설정되지 않습니다.

다음은 내 멤버십 제공 업체 수업입니다. 클래스 라이브러리 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);
        }
    }
}

다음은 내 비즈니스 도메인 라이브러리를 참조하는 SEPERATE TEST 클래스 라이브러리 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>

다음은 "객체 참조가 객체의 instanve에 설정되지 않은"내 메소드입니다.

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

공급자 .CreateUser 라인에 던져집니다

도움이 되었습니까?

해결책

CreateUser를 호출하기 전에 테스트 코드에서 Provider.initialize (...)에게 전화해야한다고 확신합니다.

다른 팁

아무도 대답하지 않았습니다. 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 메소드를 호출하면 구성이 읽히면 구성에 지정된 유형이 구문 분석,로드 및 초기화됩니다.

CreateUser 또는 그 내부의 스택 아래 어딘가에있는 Provider.createUser의 오류입니다. 아마도 전화하기 전에 NULL을 확인할 수 있습니다.

아마도 종속성이 누락되었을 것입니다 - 당신은 경로에 관련 DB DLL을 얻었습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top