我正在创建一个平台/基础组件(.NET 程序集集),它将负责访问(读/写)配置值。该组件将由将在平台上创建的其他组件使用。
我希望这个组件对消费者来说易于使用,同时具有很高的可测试性和可维护性。在我当前的设计中,我有一个包含一些方法(例如 GetKeyValueSetting)的静态类(ConfigurationManager)。此 ConfigurationManager 类的特殊之处在于它既可以从本地 .NET .config 文件中获取配置值,也可以从 SharePoint 列表(一些组件托管在共享 SharePoint 环境中)甚至从另一个共享配置值存储中获取配置值. Manager 应该能够以优先方式从多个位置读取:
- 如果在 SharePoint 上运行:1. SharePointSettingsProvider,2. SharedStoreSettingsProvider
- 如果不在 SharePoint 上运行: 1. ConfigFileSettingsProvider 2. SharedStoreSettingsProvider
我知道静态类会在可测试性、可扩展性等方面产生很多问题,所以我不想使用它。我的下一个替代方案是 Singleton,但就上述 -ilities 而言,这并不是一个更好的解决方案。有更好的解决方案的想法吗?
我目前的设计如下:
public static class ConfigurationManager
{
// internal for testability
internal IEnumerable<ISettingsProvider> SettingsProviders {get;set;}
// internal for testability
internal ISettingsProviderFactory ProvidersFactory {get;set;}
public static string GetKeyValueSetting(string key)
{
}
}
public interface ISettingsProvider
{
string GetKeyValueSetting(string key);
}
public class ConfigFileSettingsProvider : ISettingsProvider
{
}
public class SharePointSettingsProvider : ISettingsProvider
{
}
public class SharedStoreSettingsProvider : ISettingsProvider
{
}
public interface ISettingsProviderFactory
{
IEnumerable<ISettingsProvider> GetProviders();
}