2

私のアプリケーションに関する背景だけです。データの永続化に Entity Framework 4.1 を使用する ASP.Net MVC 3 Web アプリを開発しています。私のアプリケーションは階層化されており、UI レイヤー、サービス レイヤー、リポジトリ レイヤーなどがあります。制御コンテナーの反転にも Unity を使用しています。

ユーザーがアプリケーションに登録すると、 StringBuilderを使用して 2 つのランダム コード (電子メールとモバイルの確認コード) を作成します。次に、これら 2 つのランダム コードをユーザー オブジェクトの適切なプロパティに割り当てます。以下を参照してください。

User validateUser = new User();

validateUser.firstName = model.firstName.Trim();
validateUser.lastName = model.lastName.Trim();
validateUser.email = model.Email.Trim();

//Create Email and Mobile Verification Codes
string randomEmailCode = "";
randomEmailCode = _notifyService.GenerateEmailCode();
validateUser.emailVerificationCode = randomEmailCode;

string randomMobileCode = "";
randomMobileCode = _notifyService.GenerateMobileCode();
validateUser.mobileVerificationCode = randomMobileCode;

NotifyService

public string GenerateEmailCode()
{
    StringBuilder builder = new StringBuilder();

    builder.Append(RandomString(4, true));
    builder.Append(RandomNumber(1000, 9999));
    builder.Append(RandomString(2, false));
    return builder.ToString();
}

public string GenerateMobileCode()
{
    StringBuilder builder = new StringBuilder();

    builder.Append(RandomString(3, true));
    builder.Append(RandomNumber(1000, 9999));
    builder.Append(RandomString(2, false));
    return builder.ToString();
}

private int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

private string RandomString(int size, bool lowerCase)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < size; i++)
        {
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
            builder.Append(ch);
        }
        if (lowerCase)
            return builder.ToString().ToLower();
        return builder.ToString();
    }

次に、ユーザーを DBcontext に追加し、SaveChanges() メソッドを呼び出して、新しいユーザーをデータベースに保存します。

_accountService.AddUser(validateUser);
_accountService.Save();

ここで、データベースにアクセスして、追加された新しいユーザーを見つけると、emailVerificationCodemobileVerificationCodeはどちらも同じです。ただし、コードの次の行にブレークポイントを配置すると

randomEmailCode = _notifyService.GenerateEmailCode();

保存までトレースしてから、データベースで新しいユーザーを確認します。予想どおり、 emailVerificationCodemobileVerificationCodeの両方のコードが異なります。

アプリケーションを実行すると、両方のプロパティに同じコードが挿入される理由がわかりません。

誰でもこれを手伝ってもらえますか?

ありがとう。

アップデート

ジェーンが提案したように、つまり、各プロパティにハードコードされた値を次のように入力しました

validateUser.emailVerificationCode = "emailCode";
validateUser.mobileVerificationCode = "mobileCode";

アプリケーションを再度実行すると、今度はハードコードされた 2 つの値が期待どおりに挿入されました。これは私の 2 つのメソッドGenerateEmailCode()GenerateMobileCode()が正しく機能していないということですか?

4

1 に答える 1

3

これらのランダムコードを生成する方法に問題がある可能性があります。他の人が指摘したように、問題は、ランダム クラスのインスタンスを作成する時間が近すぎる可能性が最も高いです。

静的乱数発生器を宣言してみてください:

static Random r = new Random();

次に、静的ランダムを使用してコードを生成します(コードを生成する方法は明らかにあなた次第ですが、このようなものからアイデアが得られるはずです):

 public static string generateCode()
        {          
            string chrs = "abcdefghijklmnopqrstuvwxyz";
            char[] arr = chrs.ToCharArray();
            string code = "";
            for (int i = 0; i < 5; i++)
            {
                code += arr[r.Next(arr.Count())];
            }
            return code;
        }

これを実行すると:

 var firstCode  = generateCode();
 var secondCode = generateCode();

私は2つの異なる値を取得します。

ここに別の役立つリンクがあります

于 2012-09-25T10:29:48.237 に答える