2012-09-25 43 views
2

只是关于我的应用程序的一些背景知识。我正在开发一个ASP.Net MVC 3 Web应用程序,它使用Entity Framework 4.1进行数据持久化。我的应用程序是分层的,它有一个UI层,服务层,Repository层等。我也使用Unity来控制我的Inversion of Control Container。覆盖字符串属性问题

当用户在我的应用程序中注册时,我使用StringBuilder创建了两个随机代码(电子邮件和手机验证码)。然后我将这两个随机代码分配给它们在用户对象中的相应属性,见下文。

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码如预期的那样不同。

我不明白为什么当我运行该应用程序时,它会为两个属性插入相同的代码。

任何人都可以请帮忙吗?

谢谢。

UPDATE

我一样珍建议,即把在硬编码值的每个属性,像这样

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

再次运行应用程序,这时候两个硬编码值插入如预期。这是否意味着我的两个方法GenerateEmailCode()GenerateMobileCode()无法正常工作?

+0

所以这两个代码只有当你在调试? – Thousand

+0

@JaneDoe是的简,只有当我调试时才会有所不同。 – tgriffiths

+0

当你运行它时,哪些代码是重复的?移动或电子邮件代码? – Thousand

回答

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 DIF不同的价值观。

here's another helpful link

+0

谢谢你的简。 – tgriffiths