在静态构造函数中初始化简单注射器容器是否合法?

例:

using SimpleInjector;

public static Bootstrapper
{
    private readonly static Container container;

    static Bootstrapper()
    {
        Bootstrapper.container = new Container();
    }
}

最佳答案

正如@NedStoyanov所说,静态构造函数可保证唯一性,因此这可能是有益的。但是,静态构造函数的缺点是它们通常更难调试,并且从cctor主体抛出的任何异常都包装在InitializationException中,这使查看实际问题更加困难。

我还想重复@WSriramSakthivel的警告:尽管在合成根目录中将Container声明为public readonly static字段,但应尽可能防止从合成根目录之外访问此字段。从复合词根外部使用它意味着应用Service Locator anti-pattern

请注意,使用cctor初始化容器也会有不利之处。在集成测试中验证容器并运行一些使用该容器构建对象图的集成测试时,您通常希望让每个测试都有其自己的容器实例,并具有略有不同的配置。使用cctor时,您将无法使用此功能。

长话短说,尽管使用cctor可能会很好,并且提供了一些不错的保证,但我认为在大多数情况下,这只会成为问题。

10-08 07:54
查看更多