Entity framework ObjectContext从不从接口派生??对于多种类型的ObjectContext,您如何应用DI/IoC?

Entity framework ObjectContext从不从接口派生??对于多种类型的ObjectContext,您如何应用DI/IoC?,entity-framework,dependency-injection,inversion-of-control,Entity Framework,Dependency Injection,Inversion Of Control,如果系统具有多种类型的对象上下文。例如:BillingObjectContext、HumanResourceObjectContext等。这些都是从ObjectContext派生的,但ObjectContext类并没有实现像IOObjectContext这样的任何特定接口。如果有多种类型的ObjectContext(比如使用Ninject),您将如何应用DI/IoC?如果您在测试中必须依赖它,您必须模拟它;这并不比实现一个接口困难多少。另请参见。为什么我们不能创建要在测试中使用的实际上下文对象?

如果系统具有多种类型的对象上下文。例如:BillingObjectContext、HumanResourceObjectContext等。这些都是从ObjectContext派生的,但ObjectContext类并没有实现像IOObjectContext这样的任何特定接口。如果有多种类型的ObjectContext(比如使用Ninject),您将如何应用DI/IoC?

如果您在测试中必须依赖它,您必须模拟它;这并不比实现一个接口困难多少。另请参见。

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

我知道关于这个问题的大多数答案都建议使用DI/IoC设计为数据上下文等创建接口。但我使用实体框架的原因正是为了不为我的数据库连接、对象模型和简单CRUD事务编写任何接口。为我的数据对象编写模拟接口,并编写复杂的可查询对象以支持LINQ,这违背了依赖经过高度测试和可靠的对象的目的

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

如何为测试环境指定连接字符串?由于所有测试都在它们自己的专用测试项目中,因此为测试数据库添加一个带有连接字符串的新
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. 
        }
    }
}

+关于模拟它的东西,但是在需要的地方注入适当的ObjectContext呢?这就是DI/IoC的用途。使存储库将上下文作为构造函数参数。