Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该将上下文注入到存储库类中吗?_C#_Asp.net_Asp.net Mvc 3_Entity Framework_Ninject.web.mvc - Fatal编程技术网

C# 我应该将上下文注入到存储库类中吗?

C# 我应该将上下文注入到存储库类中吗?,c#,asp.net,asp.net-mvc-3,entity-framework,ninject.web.mvc,C#,Asp.net,Asp.net Mvc 3,Entity Framework,Ninject.web.mvc,我有许多类似于以下内容的存储库类: public class ProfileRepository : IProfileRepository{ private MyEntities myEnt = new MyEntites(); ... } MyEntities类是使用Entity Framework在my.edmx文件中生成的my实体。我在我的所有存储库类中不断使用这个对象,并且我的所有存储库类都被注入到我的控制器中。有没有一种方法/将myEnt对象注入到我的存储库类中是

我有许多类似于以下内容的存储库类:

public class ProfileRepository : IProfileRepository{
     private MyEntities myEnt = new MyEntites();
     ...
}
MyEntities类是使用Entity Framework在my.edmx文件中生成的my实体。我在我的所有存储库类中不断使用这个对象,并且我的所有存储库类都被注入到我的控制器中。有没有一种方法/将myEnt对象注入到我的存储库类中是否是一种良好的做法,它是否也能以同样的方式处理并发性?

我假设MyEntities是您的上下文。如果是这样,那么是的,将上下文注入存储库是一个很好的实践。通过这种方式,您可以模拟存储库,然后您的单元测试可以测试功能,而不必担心数据库或其他持久性存储连接。

答案是肯定的

理由如下:通过在存储库中创建上下文实例,您不允许调用方控制上下文的生存期


例如,在基于web的场景中,您不希望每次创建存储库类的实例时都重新创建上下文。相反,您希望上下文在服务器上处理请求的过程中一直有效。

答案是肯定的,您应该插入上下文,但参数不同。您可以注入上下文,以便能够更精确地控制其生存期。例如,您可以有一个容器控制的生命周期(单例)或一个持续一个请求处理生命周期的上下文。至于模拟,您可以通过提供另一个实现甚至使用存储库接口的模拟库来模拟存储库;注入上下文与模仿无关。理论上,这是一个好主意,因为有一天您可能需要更改数据存储。在实践中,这种情况很少发生,模拟数据存储产生的测试的唯一目的是检查存储库的API,如果存储库只是DAL上的一层薄皮,那么这种练习就没有特别的意义了。@Robert:true。虽然模拟存储库很常见,但我几乎无法想象模拟数据存储只是为了测试存储库本身。存储库的实现和底层数据存储之间的依赖关系是稳定的。存储库与其客户端之间的依赖关系是不稳定的。