2011-08-11 85 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我使用命令並讓主控制器根據傳入的命令隱藏和顯示錶單,因此表單中的邏輯儘可能少。這可能會或可能不會適合你正在做的事情。

祝你好運