【问题标题】:C# simple library project with OOP带有 OOP 的 C# 简单库项目
【发布时间】:2017-06-01 14:53:04
【问题描述】:

我想为图书馆制作一个简单的软件。我刚刚开始掌握 C# 中 OOP 的概念,我的一位教授告诉我,在代码中包含存储库类是一种很好的做法,这样客户端代码就不会直接与处理数据的类交互根据。所以我试图让登录/注册表单在 Windows 窗体中工作,但我遇到了一些问题。

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

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

非常感谢。

【问题讨论】:

  • 提示,你可以去掉 using 语句之间的{。它们将共享相同的{ ... },并且您会稍微减少嵌套。
  • 查看实际调用GetByUsernameAndPassword 的(您的表单的)代码也会有所帮助。在这两个部分之间建立联系将有助于解决问题。
  • 您的方法在失败时返回null,但至少有两个失败场景,它不会让调用代码知道发生了哪个。我认为让这种方法不那么具体很有用:与其查找具有给定用户名 密码的用户,不如创建一个仅查找具有给定用户名的用户的方法。这使得它在多种场景中都很有用:注册码可以使用它来确定用户名是否已被使用,登录码可以使用它来确定用户是否存在,如果存在,则他们的密码是否匹配。

标签: c# .net oop


【解决方案1】:

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

如果您的应用程序的用户数较少,则文本文件可能没问题,但为它定义格式很重要(例如,每行 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

【讨论】:

  • 我会使用Any() 而不是Count() &gt; 0,因为一旦找到匹配项,它就会停止迭代。 Count 必须迭代整个序列。但是,如果您主要通过用户名查找用户,我会使用 Dictionary&lt;string, User&gt; 而不是 List&lt;User&gt;
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2021-07-20
  • 2015-06-05
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多