Почему этот экземпляр, инициированный Unity, не является единственным?

В моем приложении asp.net-mvc у меня есть statis MvcApplication, который вызывает статический метод CreateContainer().

В этом методе я создаю контейнер 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. Однако в моем журнале я вижу, что мой конструктор срабатывает каждый раз, когда запрашивается этот экземпляр.

Что я делаю неправильно?

2 ответа

Решение

Для синглтона вы должны переместить определение контейнера за пределы функции и сделать его статическим. Установите его в ноль по умолчанию.

Затем в вашей функции CreateContainer проверьте, является ли контейнер пустым. Если это так, создайте его и инициализируйте. в противном случае просто верните его.

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;
}

Я думаю, что это сработает, если вы решаете ISearchService и не LuceneSearchService напрямую - в этом случае я думаю, что Unity будет каждый раз создавать новый экземпляр, так как не будет существующего отображения.

Лично я бы также зарегистрировал это как:container.RegisterType<ISearchService, LuceneSearchService>(new ContainerControlledLifetimeManager());

Другие вопросы по тегам