我在MVC应用程序中使用存储库模式。每个存储库都包含数据检索方法,如GetByID,GetByXXXX,GetByYYYY。如果我需要从其他实体的控制器执行这样的方法,我需要为该操作实例化该存储库。 你认为这种方式对于系统而言是昂贵的吗?我应该不将这些方法设为静态吗? 谢谢!
答案 0 :(得分:1)
你不应该让它们变得静止。您应该使用IoC容器来执行依赖注入。
以下是代码示例:Entity Framework 4 CTP 4 / CTP 5 Generic Repository Pattern and Unit Testable
发布使用IoC容器: NuGet for Structuremap:http://nuget.org/List/Packages/StructureMap-MVC3
博文:http://www.bengtbe.com/blog/post/2009/02/27/Using-StructureMap-with-the-ASPNET-MVC-framework.aspx
答案 1 :(得分:1)
实例化存储库并不是一项昂贵的操作,尤其是在根据Web请求的正常往返时间进行测量时。如果存储库是只读的,那么使用静态实例没有问题,但如果它是读写的,那么每个请求都需要一个单独的存储库。
答案 2 :(得分:1)
就像我们所说的那样,我会说“这取决于......”。就像保罗在他的回答中提到的那样,使用依赖注入是很好的 - 但无论你是否这样做都不会影响你问题的核心。
我已经汇总了几个应用程序,但是你的代码是否在构造函数中使用了DI
private ISomeInjectedType myRepository;
public SomeController(ISomeInjectedType type)
{
myRepository = type;
}
或只是实例化类型
private ISomeType myRepository;
public SomeController()
{
myRepository = new SomeType();
}
您基本上可以从代码中获得相同的结果 - 将可维护性排除在论证之外。
我已经通过DI方法为许多应用程序做到了这一点,并且从性能的角度来看已经找到了零缺点 - 即使在无意中让团队失控并最终注入/创建大约12“ “为每个控制器构造函数创建的存储库。
无论哪种方式,任何最适合你的方式。你提到你开始使用MVC了。我的想法是肯定的,使用DI,但是当你准备好时就这样做。
采取您需要的小步骤,以便开始运行,然后根据需要推进它们。
答案 3 :(得分:0)
存储库实例化不是性能成本高昂的操作,也不是ORM会话的创建(无论是NHibernate ISession还是EF ObjectContext)。不要进行不必要的微观优化,并使用IoC工具武装自己,轻松透明地注入所有存储库依赖项(这比第一次使用它之前的情况要简单得多)。
静态方法在这里没有任何帮助,因为你不处理静态上下文(你应该有一个ORM Session的具体实例 - 那是一个状态 - 你无法在静态环境中使用它。)