2017-06-01 117 views
-1

我想为图书馆做一个简单的软件。我刚刚开始在C#中掌握OOP的概念,并且我的一位教授告诉我们,在您的代码中使用存储库类是一种很好的做法,这样客户端代码就不会直接与处理数据的类进行交互基础。所以我正在尝试在Windows窗体中创建登录/注册表单,但我遇到了一些问题。C#简单图书馆项目与OOP

public User GetByUsernameAndPassword(string username, string password) 
    { 
     using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) 
     { 
      using (StreamReader sr = new StreamReader(fs)) 
      { 
       while (!sr.EndOfStream) 
       { 
        User item = new User(); 
        item.FirstName = sr.ReadLine(); 
        item.LastName = sr.ReadLine(); 
        item.Username = sr.ReadLine(); 
        item.Password = sr.ReadLine(); 
        if (item.Username == username && item.Password == password) 
        { 
         return item; 
        } 
       } 
       return null; 
      } 
     } 
    } 

我的意思是,我想看看,当我注册一个新用户,如果已存在使用同一用户名的另一个用户时,如果有,我想一个消息框出现说相同的用户名不能使用两次。我怎样才能做到这一点?如果返回的结果为空,如何让消息框出现,并在结果返回类User的对象时登录用户?

非常感谢。

+1

提示,你可以消除你的使用语句之间的'{'。他们将共享相同的'{...}',并且您可以稍微减少嵌套。 – Amy

+0

这将有助于查看实际调用'GetByUsernameAndPassword'的代码(您的表单)。连接这两部分将有助于解决问题。 –

+0

您的方法在失败时返回'null',但至少有两个失败场景,并且它不会让调用代码知道发生了什么。我认为让这种方法更具体一些很有用:不要用给定的用户名*和密码查找用户,而要创建一种只查找具有给定用户名的用户的方法。这在多个场景中很有用:注册代码可以使用它来确定用户名是否已被占用,登录代码可以使用它来确定用户是否存在,如果是,则密码是否匹配。 –

回答

1

在开始考虑寻找重复的用户名之前,我建议你为你的“数据库”定义一个结构。在这一刻,这看起来是一个简单的文本文件,但我看不到任何规定来存储多个用户。

如果您的应用程序用户数较少,那么文本文件可能会很好,但为其定义格式很重要(例如,每行一个用户,属性以逗号分隔为基本想法)。如果是这种情况,我建议在启动时将整个文件读入RAM中并将其存储在IEnumerable类型中。你可能想要考虑一个合适的数据库解决方案(可能是基于SQL的东西),因为你很快就会发现这个问题。文本文件在这一点上变得效率低下。

一旦你得到这个排序,检测重复变得容易。例如,如果您有一个用户对象列表,您可以:

private List<User> users; 

internal bool DoesUsernameExist(string username) 
{ 
    return (this.users.Where(x => x.Username == username).Count() > 0); 
} 

另一件要注意的事情;用纯文本存储密码可能不是一个好主意。您可能想要使用业界标准的哈希算法来对密码进行哈希处理以保护它们:https://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1(v=vs.110).aspx

+0

我会使用'Any()'而不是'Count()> 0',因为一旦找到匹配就会停止迭代。 Count必须遍历整个序列。但是,如果你主要通过用户名查找用户,我会使用'Dictionary '而不是'List '。 –