在全球范围内持有存储库是否常见?

时间:2012-01-26 23:09:23

标签: asp.net-mvc-3 session repository

在存储库示例中,我看到在会话打开时实例化存储库,这似乎就在整个会话中。在控制器操作中,然后通过对存储库的调用来访问数据层。这是常见做法吗?根据操作请求在需要的基础上实例化存储库是不是更有意义?

编辑:一个更精确的场景。

public class myController : Controller {
  IMyRepository myRepository;

  public myController(IMyRepository repositoryParam){
    myRepository = repositoryParam;
  }

  public ActionResult someAction(){
    MyClass myClass = myRepository.RepositoryAction();
  }
}

在这种情况下,myRepository是myController的全局(注意:这是基于Steven Sanderson的一个例子)。我已经看到它也为所有控制器定义了访问权限,但这是一个简单,精确的例子。在这个例子中,为什么要在全局使用存储库而不是每次使用?

1 个答案:

答案 0 :(得分:2)

要回答你的问题,特拉维斯,你应该在Repository Pattern上读一下。此模式用于提供许多优点,包括:

  • 它集中了数据逻辑或Web服务访问逻辑。
  • 它为单元测试提供了替换点。
  • 它提供了一个灵活的架构,可以根据应用程序的整体设计进行调整。

关于你的问题:"这是一种常见做法吗?"答案是,"它应该是。"但是,不幸的是,我没有像我希望的那样看到它。

现在,在您的示例中,您将显示在控制器类的上下文中创建的存储库。 (请注意,这与正在制作的对象" global"并不是一样的。正如你所说的那样。全局意味着可以从任何范围访问该对象。在维基百科上阅读更多相关信息here 。)

在任何情况下,其中一个优点是存储库允许您使用正确的具体版本的存储库来更改访问数据的方式(甚至是访问数据的位置)。所以,你可能有:

  • IRepository - 具体存储库实现的接口。
  • DatabaseRepository - 访问数据库中的数据。
  • FlatFileRepository - 从平面文件中访问您的数据。

如果您希望切换到其他数据源,只需更换控制器中的具体实现即可。 (请注意,通过dependency injection有更多高级和灵活的方法,但这超出了这个问题的范围,尽管它在存储库模式中可以/可以发挥很大作用。)

无论如何,假设您的项目团队决定"嘿,我们将从平面文件中存储所有数据切换到使用数据库。"好吧,如果您在整个代码中分散了特定存储库的实例,那么现在您需要修复和更新许多不同的区域,这有点否定了存储库模式的优点。但是,通过声明控制器的成员存储库,您只需从FlatFileRepository切换到DatabaseRepository,实现新存储库,就完成了!团队中的每个人都很开心!

更新:"为什么要实例化类变量?"

要回答这个问题,你必须考虑两个选择。第一个选项是你可以在内存中保存一个相对较小的对象。另一种方法是,每当用户需要访问您的一个操作时,您可以在内存中实例化一个新对象,从而导致分配新内存(当您离开该对象所在的范围时释放该内存)并且需要更多工作。托管您的网络应用程序的服务器。

如果您考虑如何使用网站,用户会频繁地使用这些操作。每个操作都表示您网站的一部分。如果您每次都需要存储库进行实例化,那么您很快就会为服务器提供比实际需要更大的工作负载 - 特别是在您的网站规模扩大时。 (我相信其他人可以想到其他原因,为什么你会想要按照教程中显示的方式与每个单独操作中的实例化一起进行。)

然后,当然,正如我上面提到的,存在重构问题。这就是"做出改变的效率"或者提高可维护性。

希望能帮助你更多,更好地回答你的问题!