我正在一个相当复杂的多层应用程序上工作,我想模拟其中一层的数据源,因为很多时候很难到达数据库。 (其中一些甚至还不存在。)

我想做的是在一个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,其余的应用程序不必担心。

10-08 06:49
查看更多