2016-09-07 26 views
0

我期待使用在Program.cs中實例化的變量Config,以便能夠在我擁有的其他類中使用。據我瞭解,我們需要使用依賴注入,但不知道如何實現。應用程序寬靜態變量C#控制檯應用程序


的Program.cs

public class Program 
{ 
    static IConfigurationRoot Config = null; 

    public static void Main(string[] args) 
    { 
     Config = new ConfigurationBuilder() 
      .SetBasePath(Environment.CurrentDirectory) 
      .AddJsonFile("appsettings.json") 
      .AddEnvironmentVariables() 
      .Build(); 
    } 
} 

TestClass.cs

public class TestClass 
{ 
    public void DoSomething() 
    { 
     // Now I need to use that instantiated Config object here. 
    } 
} 
+1

在另一個類中引用可執行程序集的成員是很少見的。我認爲你應該重新考慮設計。 – Crowcoder

+0

你能提出一個建議嗎?我的要求是能夠在應用程序的任何位置訪問所有配置條目。 – TSR

+0

我喜歡創建一個配置庫,並像任何數據存儲(如數據庫)一樣處理配置數據。所以也許可以專門創建一個類來保存這些字段。如果它是通過「Program.Config」公開的話,您可以使用該變量,但是它會根據SOLID原則濫用Program類。 – Crowcoder

回答

0

如果Config被聲明public static,那麼它可以從其它類訪問作爲Program.Config

2

您可以用make config static public,所以它可以在任何地方在你的應用程序訪問,或者,如果你想使用依賴注入,讓你的TestClass構造要求一個IConfigurationRoot

public TestClass(IConfigurationRoot config) 
{ 
    // do what you need 
    // save a reference to it on a local member, for example 
} 

現在你每次實例化一個新的TestClass,你將不得不傳遞參數給它的構造函數IConfigurationRoot它將使用的對象。如果這被證明是麻煩的(如:你實例TestClass了很多,在很多不同的地方),那麼你可以使用一個TestClassFactory

另外,如果你不想使用ASP.NET就像Crowcoder指出的那樣,您可以像創建任何數據庫模型一樣,創建一個配置庫。例如,該存儲庫將從json文件獲取配置。

事情是這樣的:

public class ConfigurationRepository : IConfigurationRepository 
{ 
    public string GetBasePath() 
    { 
     // Read base path from config files 
    } 

    public string SetBasePath() 
    { 
     // Write base path to config files 
    } 
} 

然後你會用DI傳遞IConfigurationRepositoryTestClass