我正在研究一个相当复杂的多层应用程序,我想模拟其中一个层的数据源,因为它很难在很多时候进入数据库。 (其中有些甚至还不存在。)
我希望能够做的是在其中一个Web服务中设置一个标志,让它使用模拟数据源而不是数据库连接。我只是将数据放在xml文件中。我已经成功地在单元测试中使用了moq,但似乎我无法在运行时使用模拟替换注入的数据库进行精神跳跃。
筹码:
答案 0 :(得分:1)
不是设置标志,为什么不使用和接口并传递它?例如。 IDataSource
。
例如,您的网络服务需要IDataSource
作为其构建的一部分。
然后,你的moq可以实现界面,你可以传入它,而不是IDataSource
的真正的实现。同样,您的真实数据库也将实现该接口......
public class MoqDataSource : IDataSource
{
...
}
public class RealDatabase : IDataSource
{
...
}
对于替换真实数据源,在运行时,您可以使用某种返回IDataSource
的工厂类,然后使用任意数量的方法来确定工厂返回的内容。
E.g。工厂读取一些配置文件,根据你在那里设置的内容,它会返回一个真实的数据源,或者moq ......
public class DataSourceFactory
{
public static IDataSource CreateDataSource()
{
if (/* are we using real data source */)
{
return new RealDatabase();
}
else
{
return new MoqDataSource();
}
}
}
无论您将其称为 factory 还是其他内容都无关紧要......它只是封装IDataSource
创建的一种方式。只有工厂类需要关注您要创建的IDataSource
类型,应用程序的其余部分并不必担心。
答案 1 :(得分:0)
恕我直言,最简单的方法可能是使用可以设置依赖关系信息的文件。这样,您可以通过简单的xml文件更改在Moq和实际数据源之间切换(甚至可以使用不同的构建目标驱动它,等等,但这超出了原始问题的范围)。
为了集成Ninject的xml文件以供使用,您需要一个扩展名:
https://github.com/ninject/ninject.extensions.xml
... HTH