Почему этот экземпляр, инициированный 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());