我只想最终将我的头围绕静态/非静态成员。我将在我的示例中使用我的ASP.NET MVC 2 + Ninject + Repositories + Providers + Entity Framework应用程序。
因此,假设我在Ninject内核中绑定了我的EF容器的单例实例,如果我有这个代码,我会看到性能改进,或者它将如何受到影响?
public class Repository<T> where T : class {
// private readonly DefaultContainer = null;
// REPLACED BY:
private static readonly DefaultContainer = null;
[Inject]
public Repository(
DefaultContainer DefaultContainer) {
DefaultContainer = DefaultContainer;
}
}
public class EmployeeRepository {
// private readonly DefaultContainer = null;
// REPLACED BY:
private static readonly DefaultContainer = null;
[Inject]
public EmployeeRepository(
DefaultContainer DefaultContainer) {
DefaultContainer = DefaultContainer;
}
}
在上面的两个存储库中,我有一个DefaultContainer
的私有成员,它默认为null,然后注入到永久设置的构造函数中。
现在,如果它的静态超过非静态,是否会提高性能?我问,因为通过MSDN阅读,我读到静态成员只被分配一次,这是否意味着我可以在提供者中拥有20个存储库,并且所有这些存储库都使用完全相同的DefaultContainer
?或者,是否意味着Repository<T>
的第一个实例将分配DefaultContainer
,但是T
的所有后续存储库,无论它们是在应用中创建的,都将使用DefaultContainer
}?
如果它是第一个选项,那么不会增加应用程序的性能,因为所有人都使用了一个对象吗?
如果它是第二个选项,那么即使它为每个Repository<T>
而不是每个Repository<T>
分配一次,它也不会有某种性能提升吗?
我很感激有人对我有所了解。我想我明白了,但我只需要有人为我澄清。
答案 0 :(得分:3)
简短回答:不,没有性能优势。
答案很长:通过使用static
字段,你会模糊自己的责任,即保持依赖的生活方式。像Ninject这样的容器通常可以选择解决单例或瞬态问题。如果你决定你的存储库(和DefaultContainer
)应该是暂时的而不是单例,但仍然有静态字段,那么当实例连续覆盖共享字段时,你将面临一个非常讨厌的竞争条件。
答案 1 :(得分:2)
我建议取消静态成员,让ioc容器管理对象的生命周期。我最近做了一系列博客文章,涵盖了同样的基础。我使用nhibernate而不是实体框架。以下是可能感兴趣的链接:
http://blog.bobcravens.com/category/ninject/
希望这会有所帮助。
鲍勃