Почему этот экземпляр, инициированный Unity, не является единственным? - PullRequest
1 голос
/ 17 декабря 2009

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

В этом методе я создаю свой контейнер ioc unity:

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 ]

5 голосов
/ 17 декабря 2009

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

Затем в вашей функции 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;
}
1 голос
/ 17 декабря 2009

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

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

...