带OOP的C#简单库项目

时间:2017-06-01 14:53:04

标签: c# .net oop

我想为图书馆制作一个简单的软件。我刚刚开始在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返回对象时登录用户,如何显示消息框?

非常感谢。

1 个答案:

答案 0 :(得分:1)

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

如果您的应用程序用户数量较少,则文本文件可能没问题,但为其定义格式很重要(例如,每行1个用户,属性以逗号分隔为基本概念)。如果是这种情况,我建议在启动时将整个文件读入RAM并将其存储在IEnumerable类型中。

如果您的应用程序将拥有大量用户数(并且我怀疑在给定上下文的情况下,它不会),您可能需要考虑一个正确的数据库解决方案(可能是基于SQL的),因为您很快就会发现文本文件此时效率低下。

一旦你对它进行了排序,检测重复就变得容易了。例如,如果您有一个User对象列表,则可以:

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