我會採取完全不同的方法,一個不涉及任何東西static
。
首先創建一個類來強鍵入你後的配置設置:通過創建一些庫
public class MyConfig
{
int DecimalPlaces { get; set; }
string AdministratorEmail { get; set; }
//...
}
然後抽象掉持久層:
public interface IMyConfigRepository
{
MyConfig Load();
void Save(MyConfig settings);
}
,可以讀取類寫這些設置可以將靜態地宣佈,他們依賴於該庫的實現:
public class SomeClass
{
private readonly IMyConfigRepository _repo;
public MyClass(IMyConfigRepository repo)
{
_repo = repo;
}
public void DoSomethingThatNeedsTheConfigSettings()
{
var settings = _repo.Load();
//...
}
}
現在實現倉庫接口(您想在一個數據庫中的設置,明天可能會被序列化到一個.xml文件,並使用明年雲服務今天),你想要的方式和配置界面,你需要它。
便大功告成:你現在需要的是在接口綁定它的實現方式。這裏有一個例子Ninject(寫在NinjectModule
派生類Load
方法覆蓋):
Bind<IMyConfigRepository>().To<MyConfigSqlRepository>();
然後,你可以換一個MyConfigCloudRepository
實施或執行MyConfigXmlRepository
當/如果你需要一個。
作爲一個asp.net應用程序,只要確保你線了這些依賴於你的Global.asax
文件(在應用程序啓動),然後,有一個IMyConfigRepository
構造函數的參數的任何類將與MyConfigSqlRepository
注入,這將給你可以隨意加載和保存的對象。
如果您沒有使用IoC容器,那麼在應用程序啓動時您只需要new
上調MyConfigSqlRepository
,然後手動將實例注入到需要它的類型的構造函數中。
這種方法唯一的辦法是,如果你還沒有一個DependencyInjection友好的應用程序結構,這可能意味着大量的重構 - 去耦對象並消除依賴關係,使得單元測試更容易專注於單一方面,並且更容易模擬依賴關係......以及其他優點。
將它們封裝爲一個非靜態類的公共只可獲得屬性,您將它作爲依賴項傳遞給需要它的任何地方?爲什麼它必須是靜態的? –
「在兩種環境中都是一樣的」 - 不是真的,它們非常不同!在winforms中,每個用戶都有自己的應用程序實例和自己的一組靜態變量。這經常重新啓動(每次用戶結束應用程序時)。在webforms中有一個用於* all *請求的應用程序,因此靜態變量在所有用戶之間共享。除了回收,webapp將永遠活着。 –