1

私のasp.net-mvcアプリケーションには、静的CreateContainer()メソッドを呼び出すstatis MvcApplicationがあります。

このメソッドでは、unity ioc コンテナーを作成します。

private static IUnityContainer CreateContainer()
{
    var container = new UnityContainer();
    container.RegisterType<IConfigurationService, ConfigFile>();
    container.RegisterType<ILoggerService, NlogLoggerService>();

    container.RegisterInstance<ISearchService>(
        new LuceneSearchService(
            container.Resolve<IConfigurationService>(),
            container.Resolve<ILoggerService>()),
            new ContainerControlledLifetimeManager());
}

ソースをよく理解していれば、シングルトンの LuceneSearchService インスタンスが得られるはずです。ただし、私のロギングでは、このインスタンスが要求されるたびにコンストラクターがヒットすることがわかります。

私は何を間違っていますか?

4

2 に答える 2

6

シングルトンの場合、コンテナの定義を関数の外に移動し、静的にする必要があります。デフォルトではnullに設定します。

次に、CreateContainer関数で、コンテナーがnullかどうかを確認します。そうである場合は、それを作成して初期化します。それ以外の場合は、返品してください。

private static IUnityContainer container = null;
private static IUnityContainer CreateContainer()
{
    if( container == null )
    {
        container = new UnityContainer();
        container.RegisterType<IConfigurationService, ConfigFile>();
        container.RegisterType<ILoggerService, NlogLoggerService>();

        container.RegisterInstance<ISearchService>(
            new LuceneSearchService(
                container.Resolve<IConfigurationService>(),
                container.Resolve<ILoggerService>()),
                new ContainerControlledLifetimeManager());
    }

    return container;
}
于 2009-12-17T16:01:16.293 に答える