2011-08-11 50 views
2

我这样做了,要求在第一种形式的username(当应用程序被启动)一个的Windows CE 5.0设备的应用程序,然后我得到的userId来自数据库表。制作提供多种形式的紧凑型框架可变

之后出现一个菜单窗体,它接收到userId,我必须发送给菜单选项的每个构造函数userId以便以这些形式使用它。我认为必须有更好的方式来做这样的事情。

例子:

public partial class Menu : Form 
{ 
    int userId; 
    public Menu(int userId) 
    { 
     InitializeComponent(); 
     this.userId = userId; 
    } 

    private void buttonDelivery_Click(object sender, EventArgs e) 
    { 
     Delivery delivery = new Delivery(userId); 
     delivery.Show(); 
     this.Hide(); 
    } 
    ... 

可能是我应该使用这样一个全局变量?

public static class UserConfiguration 
{ 
    public static int userId; 
} 

不说,还坏习惯?

最后记住,Compact Framework不支持的app.config文件

在我看来
+0

我在你的项目中使用了你的第一个例子。它在仿真器上效果很好,但在实际设备上引发空引用异常。我应该如何处理这个问题? –

回答

2

就个人而言,我会投票支持“既不”,但会改为使用一些其他可用的建筑工具。

我非常希望有一个包含所有用户信息(您使用的ID,然后可能是其他名称,如名称等)的类。我会创建一个实例并在提交第一个Form(登录)时填充该信息,并将其保存在DI容器中(我使用this one specifically,但任何CF-supporting container都可以工作)。

然后,我会使用注入来自动将该实例推送到任何需要它的类,或让消费者根据需要从容器中将其拉出。我使用哪种机制取决于我使用的容器以及我需要的信息。由于你的数据来自数据库,我实际上倾向于使用ORM(我使用this one)来提取数据,这会给你包含用户信息的实体实例,无论如何,自动重新启动。

2

两种方式都不错,在某些情况下,如果更改构造函数签名的或在某些控件不能正常工作有些情况下,如果框架始终调用没有参数的构造函数,则不会调用构造函数。但真的取决于具体情况。

我更喜欢传递值的方法参数方式,但带有静态字段的外部类也可以正常工作。

P.S. app.config是不是最好的地方,无论如何存储运行时特定的值,所以不重要,如果在这种情况下支持或不CF ;-)

1

如果您使用控制器,它可以容纳所有需要的变量。控制器可以有一个实例化自己的静态实例属性(参见单例对象设计模式)。在开发移动应用程序时,这很常见,因为内存通常是一个限制因素。其余的方法是公共成员(不是静态的),所以你可以像这样访问。你可以让它们成为属性,或者只是使用公共成员。即使移动,我们也不会使用属性,因为它只会增加不必要的绒毛和拳击/拆箱。

在一种形式,你可以使用:

MainController.Instance.loginID = "me123"; 

另一个可以使用

MessageBox.Show("my loginID is: " + MainController.Instance.loginID); 

您还可以添加类似的方法:

MainController.Instance.ClearSession(); 

在内部只设置登录ID来空值。等等。我个人使用主控制器来显示窗口。因为在移动中我们需要确保我们的资源也被清理。

MainController.Instance.ShowLoginForm(); 

的MainController代码开始应该是这个样子:

public class MainController : IDisposable { 
//all forms we are controlling 
LoginForm _loginForm = null; 

//all public members 
public string loginID = null; 


#region Singleton Instance stuff 
private static MainController me = null; 
private void MainController() { } 
public static Instance { 
    get { 
     if(me == null) { 
      me = new MainController(); 
     } 
     return me; 
    } 
} 
#endregion 


//all public methods 
public void Init(someargshere) { 
    //TODO some init like load config files, etc. 
} 
public void Dispose() { 
    //TODO cleanup 
} 
public void ClearSession() { 
    loginID = ""; 
} 

public void ShowLoginForm() { 
    if(loginForm!=null) { 
     loginForm.Dispose(); 
     loginForm == null; 
    } 

    loginForm = new LoginForm(); 
    loginForm.Show(); 
    loginForm.BringToFront(); 
} 

//etc 
} 

使您在Program.cs中的代码做的第一件事就是初始化你的主控制器

main(string[] args) { 
    //start a controller 
    MainController.Instance.Init(passomeargs if needed); 

    //now fire off our main form 
    Application.Run(new MainForm()); 
} 

现在所有表单都可以通过MainController访问数据

Personall我使用命令并让主控制器根据传入的命令隐藏和显示表单,因此表单中的逻辑尽可能少。这可能会或可能不会适合你正在做的事情。

祝你好运