2013-04-16 32 views
2

我有一個3層應用程序設置,就像控制檯表示層一樣。在我的商業邏輯中,我有一個類,我聲明瞭一些固定的不同變量,即值不會改變。這些變量的值取自應用程序設置。在三層控制檯應用程序中使用常量或全局變量

現在我發現的問題是我的類調用了不同的方法,其中這些變量是通過方法簽名傳遞的。這是好的做法嗎?如果不是,用常量代替它會更好嗎?如果是這樣,常量應該在哪裏生存,以便我可以在需要它們的地方訪問它們而不是傳遞變量?

編輯

添加一些代碼爲你們。所以他們是我在這裏提到的全局變量。

行,所以在我的控制檯應用程序(演示),我現在有這樣的事情:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     MainClass myClass = new MainClass(appSetting1, appSetting2, appSetting3); 
    } 
} 

然後在MainClass我:

public class MainClass 
{ 
    private string _appSetting1 = string.Empty; 
    private string _appSetting2 = string.Empty; 
    private string _appSetting3 = string.Empty; 

    public MainClass(string appSetting1, string appSetting2, string appSetting3) 
    { 
     _appSetting1 = appSetting1; 
     _appSetting2 = appSetting2; 
     _appSetting3 = appSetting3; 
    } 

    public void MyMethod() 
    { 
     Method2(_appSetting1, _appSetting2); 
     Method3(_appSetting2, _appSetting3); 
     Method4(_appSetting1, _appSetting3); 
    } 
} 

我希望你能明白我的意思。我發現自己在多個方法中傳遞全局變量。我只是覺得這樣做會更容易一些嗎?如創建一個常量類或類似的東西?我並不是100%確定最好的方法。

在我MainClass我可以宣佈我的全局變量是這樣的:

private string _appSetting1 = ConfigurationManager.AppSettings["appsetting1"]; 
    private string _appSetting2 = ConfigurationManager.AppSettings["appsetting2"]; 
    private string _appSetting3 = ConfigurationManager.AppSettings["appsetting3"]; 

但我真的想要做的是,在我的商業邏輯?

+3

顯示一些相關的代碼。否則,這都是猜測。我的意思是數據和它使用的方法。 –

+0

請給我們一些代碼請 –

+1

你是什麼意思?將變量作爲參數傳遞是否是「良好實踐」?如果這是一個全球性的常數,不要爲此煩惱。將它們定義在一個單獨的類「常量」中,然後通過調用它們來獲取它們的值。 – tnw

回答

1

另一種可能性是創建一個加載它們並將它們公開爲public readonly的類。這一直運作良好,我在過去的:

public class Settings 
{ 
    public static readonly string AppSetting1; 
    public static readonly string AppSetting2; 
    public static readonly string AppSetting3; 

    static Settings() 
    { 
     AppSetting1 = ConfigurationManager.AppSettings["appsetting1"]; 
     AppSetting2 = ConfigurationManager.AppSettings["appsetting2"]; 
     AppSetting3 = ConfigurationManager.AppSettings["appsetting3"]; 
    } 
} 

靜態構造函數在第一次訪問任何變量之前自動調用,所以您不必顯式調用它。您的程序可以訪問變量爲Settings.AppSetting1等。

+0

謝謝吉姆。那麼這個設置類應該在哪裏生活?在我的業務層? –

1

如果它們在app.config中,並且不應該更改,應始終引用它們而不是將它們作爲參數傳遞。這樣你的意圖,他們是靜態值在代碼中很清楚。

編輯

吉姆斯的回答在這種情況下是有意義的。它真的只是一個簡短的手,所以而不是寫ConfigurationManager.AppSettings [「appsetting1」];你使用Settings.AppSetting1。無論哪種方式,如果您將每個課程的頂部聲明爲課堂級變量,則您將重複自己。儘管你可以擴展它,但我喜歡Jim的回答。我將所有配置保存在數據庫中,然後使用在私有實例構造函數中具有proc調用的單例來加載配置。吉姆的回答可以在不需要更改呼叫代碼的情況下稍後實施。通常配置文件是一個痛苦。

+0

謝謝朱爾斯。好的,所以我唯一的問題就是如果我需要在不同的類中使用應用程序設置。假設我有3個需要使用appSetting1,appSetting2和appSetting3的類。我需要在全球範圍內聲明這些信息。就好像我在重複自己這一切。你怎麼看? –

+0

吉姆斯的回答在這種情況下是有道理的。它真的只是一個簡短的手,所以而不是寫ConfigurationManager.AppSettings [「appsetting1」];您使用Seettings.ApSetting1。無論哪種方式,如果您將每個課程的頂部聲明爲課堂級變量,則您將重複自己。 – Jules

1

我是無配置思維模式。

如果這些東西大概不會改變,那麼有一個項目可以引用返回值的程序集。

我回避配置文件。我意識到他們是在部署情況下需要的,但鑑於您的要求,我會推薦一個通用的類庫,其他其他可以使用和引用。

如果你必須改變某些東西不變,你改變它在一個地方。

+0

我只有約5個應用程序設置。一個新的類庫專門爲此不會有點矯枉過正? –

+0

我預計未出現業績衝擊。編譯器不會在意。 –

相關問題