ObjectContext永远不会从接口派生?在多种类型的ObjectContext的情况下,如何应用DI / IoC?

时间:2010-01-14 16:42:38

标签: entity-framework dependency-injection inversion-of-control

如果您的系统具有多种类型的对象上下文。对于Eg:BillingObjectContext,HumanResourceObjectContext等。所有派生自ObjectContext但ObjectContext类不实现任何特定的接口,如IObjectContext。如果有多种类型的ObjectContext说使用Ninject?

,你会如何应用DI / IoC?

2 个答案:

答案 0 :(得分:6)

如果你必须在测试中依赖它,你必须嘲笑它​​。 Here's a sample;它并不比实现接口困难得多。另请参阅TDD improvements in EF 4

答案 1 :(得分:0)

为什么我们不能只创建在我们的测试中使用的实际上下文对象?由于我们不希望我们的测试影响生产数据库,因此我们始终可以指定指向测试数据库的连接字符串。在运行每个测试之前,构建一个新的上下文,添加测试中需要的数据,继续单元测试,然后在测试清理部分中,删除测试期间创建的所有记录。这里唯一的副作用是自动增量ID将在测试数据库中用完,但因为它是一个测试数据库 - 谁在乎呢?

我知道关于这个问题的大多数答案建议使用DI / IoC设计来为数据上下文等创建接口,但我使用Entity Framework的原因正是为我的数据库连接,对象模型和简单编写任何接口CRUD交易。为我的数据对象编写模拟接口并编写复杂的可查询对象以支持LINQ,无法依赖经过高度测试和可靠的Entity Framework

这种单元测试模式并不新颖 - Ruby on Rails已经使用了很长时间,而且效果很好。就像.NET提供EF一样,RoR提供ActiveRecord个对象,每个单元测试创​​建它需要的对象,继续测试,然后删除所有构造的记录。

如何为测试环境指定连接字符串?由于所有测试都在他们自己的专用测试项目中,因此添加一个带有测试数据库连接字符串的新App.Config文件就足够了。

想想这会拯救你多少头痛和疼痛。

namespace ProjectNamespace
{
    [TestClass]
    public class UnitTest1
    {
        private ObjectContext objContext;

        [TestInitialize]
        public void SetUp()
        {
            // Create the object context and add all the necessary data records.
        }

        [TestMethod]
        public void TestMethod1()
        {
            // Runs the tests. 
        }

        [TestCleanup]
        public void CleanUp()
        {
            // Delete created records. 
        }
    }
}