我正在一个相当复杂的多层应用程序上工作,我想模拟其中一层的数据源,因为很多时候很难到达数据库。 (其中一些甚至还不存在。)
我想做的是在一个Web服务中设置一个标志,以使其使用模拟数据源而不是数据库连接。我只是将数据放入xml文件中。我已经在单元测试中成功使用了moq,但是似乎无法实现这种飞跃,我可以在运行时用模拟代替注入的数据库。
堆栈:
VS 2013
.Net 4.5.1
Ninject
实体框架5?
SQL Server 2012
通过SQL Server中的存储过程调用的几个附加数据库
最小起订量2.x
世界足球联合会
Web API 2
最佳答案
而不是设置标志,为什么不使用和接口并将其传递呢?例如。 IDataSource
。
例如,您的Web服务将IDataSource
作为其构造的一部分。
然后,您的最小起订量可以实现该接口,并且可以传入该接口,而不是真正的IDataSource
实现。同样,您的真实数据库也将实现该接口...
public class MoqDataSource : IDataSource
{
...
}
public class RealDatabase : IDataSource
{
...
}
至于替换实际数据源,在运行时,您可以使用某种工厂类来返回
IDataSource
,然后使用许多方法来确定工厂返回什么。例如。工厂读取一些配置文件,并根据您在此处设置的内容返回真实数据源或最小量。
public class DataSourceFactory
{
public static IDataSource CreateDataSource()
{
if (/* are we using real data source */)
{
return new RealDatabase();
}
else
{
return new MoqDataSource();
}
}
}
不管您称它为工厂还是其他名称都无所谓……这只是封装
IDataSource
创建内容的一种方法。只有工厂类需要考虑要创建哪种类型的IDataSource
,其余的应用程序不必担心。