关于静态成员的一般问题,以及关于存储库和提供者的DI的一般问题

时间:2010-12-05 20:47:30

标签: c# dependency-injection repository

我只想最终将我的头围绕静态/非静态成员。我将在我的示例中使用我的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>分配一次,它也不会有某种性能提升吗?

我很感激有人对我有所了解。我想我明白了,但我只需要有人为我澄清。

2 个答案:

答案 0 :(得分:3)

简短回答:不,没有性能优势。

答案很长:通过使用static字段,你会模糊自己的责任,即保持依赖的生活方式。像Ninject这样的容器通常可以选择解决单例或瞬态问题。如果你决定你的存储库(和DefaultContainer)应该是暂时的而不是单例,但仍然有静态字段,那么当实例连续覆盖共享字段时,你将面临一个非常讨厌的竞争条件。

答案 1 :(得分:2)

我建议取消静态成员,让ioc容器管理对象的生命周期。我最近做了一系列博客文章,涵盖了同样的基础。我使用nhibernate而不是实体框架。以下是可能感兴趣的链接:

http://blog.bobcravens.com/category/ninject/

希望这会有所帮助。

鲍勃