如前一篇文章中所述,我正在学习C#,对于我的第一篇(如果你包括你好世界和一些搞乱的东西,第二次)实际项目,我将创建一个基本的EPOS系统然后扩展它..
我的意图是将所有定价,收银员详细信息,销售交易等存储在MySQL数据库中(我可以从PHP转移到C#,但我不能让自己离开MySQL!)
我想检查的内容如下:
我有两种形式(目前)
当用户登录时,我将根据我的数据库中保存的详细信息对其进行身份验证,如果成功,我将加载主销售屏幕。
我需要以某种方式在表单之间传递信息,所以我所做的是在这里创建一个名为variableStore.cs
的新类文件,我将存储userID,userName(所以我可以拥有“当前登录:John Doe“在每个表单状态栏上。
但我也会使用相同的文件来传输“交易总额”等等。在表单之间。
这是正确的(好的,不正确,但这是你怎么做的?)做事的方式?
答案 0 :(得分:1)
不,这不是我处理事情的方式。
更好的处理方法是通过构造函数,属性或方法在表单之间传递值。
构造强>
public class SalesForm : Form
{
public SalesForm(string userName)
{
Text = "Currently Logged In: " + userName;
}
}
现在,在登录表单按钮上单击处理程序(在验证用户之后):
var mainForm = new SalesForm(userName);
mainForm.Show();
<强>属性强>
public class SalesForm : Form
{
private string _userName = null;
public string UserName
{
get
{
return _userName;
}
set
{
_userName = value;
if(!String.IsNullOrEmpty(_userName))
Text = "Currently Logged In: " + _userName;
}
}
}
再次,在“登录表单”按钮上单击“处理程序”:
var mainForm = new SalesForm();
mainForm.UserName = userName;
mainForm.Show();
方式强>
public class SalesForm : Form
{
public void SetTitle(string userName)
{
Text = "Currently Logged In: " + userName;
}
}
和
var mainForm = new SalesForm();
mainForm.SetTitle(userName);
mainForm.Show();
答案 1 :(得分:1)
我不会这样做你说的。这是一个Web应用程序吗?
您应该分别保留用户信息和业务层信息。如果需要,这将为您提供足够的自由来更改用户信息。
要传递事务总数,您应该从数据库中查询信息并将其显示在网页上。你能做这个吗?
您还可以使用以下方法传递数据: -
1. constructor
2. objects
3. properties
4. Delegates
答案 2 :(得分:1)
在谈论身份验证和授权时,您应该创建自己的IPrincipal和IIdentity实现,然后在Thread(Thread.CurrentThread)中设置。
IPrincipal继续线程,它保留在你的IIdentity上。可以查询您的实现以确定用户是否经过身份验证以及允许用户执行的操作(请参阅IsInRole)。
至于使用全局变量来存储信息,这不是一个好主意。但是,你刚开始,所以它可能对你有好处。
或者,您可以在您设置的表单上创建公共属性,并在表单关闭后,在表单上获取用户操作的结果(不要忘记,表单就像其他任何对象一样)。因此,如果表单A实例化表单B,以模态方式显示B,则在表单B关闭后获得控制权,表单A然后可以从B上的属性获得用户交互的结果(无论它们是什么)。
public class B : Form
{
// Set when the user completes a sale and closes the form with the OK button.
public SaleItem Sale{ get; private set;}
}
这比使用全局存储变量要好得多。如果我这样做,我会使用像Unity这样的依赖注入框架来获取类的实例,这些类提供了我的应用程序中的销售等功能。
答案 3 :(得分:0)
通常首选使用IServiceProvider
模式,但在小而微不足道的情况下,static
就可以了。
答案 4 :(得分:0)
对于一个小的,简单的应用程序,当你刚开始时,静态变量可以帮助让事情运行,但它不是你想要进入的习惯。您可以从一个地方写下所有状态变量开始,然后退一步,花时间考虑实际使用它们的位置。如果某些变量仅用于程序的一小部分,请尝试将其隐藏在程序的其余部分中,例如将它们放在只有程序的那一部分被赋予实例的类中的。在编写程序时,请定期休息,查看课程并考虑以下事项:
封装:我的班级是做一个定义明确的工作还是试图做各种不同的事情?如果你不能立即弄清楚班级的工作描述是什么,那么它可能做得太多了。考虑将功能分解为可以单独处理的小块。
绝缘:我的班级是否公开其他班级不应该知道的信息?我应该告诉其他班级他们需要什么才能让他们用我的工作。我还需要防止其他课程尽我所能干扰我的工作。如果其他类错误地使用了我,我应该大声抱怨(抛出异常),以便开发人员意识到出了问题。
非重复:我是否有一些看起来非常相似的代码,它们之间只有轻微的修改?尝试找到一种方法将这些代码片段合并到一个方法中,并从每个位置调用该方法。如果您发现自己正在修复错误并且必须转到代码中的多个位置来应用修复程序,这表明您正在重复自己。花时间来解决这个问题,将来在很多方面都会有所帮助。
这些原则旨在通过帮助您理解代码并通过最大限度地减少代码部分之间可能的交互次数来限制错误的可能性来帮助管理复杂性。享受学习。 :)