我会采取一种完全不同的方法,一种不涉及任何东西的方法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
构造函数参数的类都将被注入 aMyConfigSqlRepository
这将为MyConfigImplementation
您提供可以加载的对象和请随意保存。
如果您不使用 IoC 容器,那么您只需new
启动MyConfigSqlRepository
应用程序,然后手动将实例注入到需要它的类型的构造函数中。
这种方法唯一的问题是,如果您还没有一个对 DependencyInjection 友好的应用程序结构,这可能意味着要进行广泛的重构——解耦对象并消除new
依赖关系,使单元测试更容易专注于单一方面,并且更容易模拟依赖关系......以及其他优点。