1

在我的 asp.net-mvc 应用程序中,我有一个调用静态 CreateContainer() 方法的 statis MvcApplication。

在这种方法中,我创建了我的统一 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

对于单例,您应该将容器的定义移到函数之外,并使其成为静态的。默认情况下将其设置为空。

然后在您的 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;
}
于 2009-12-17T16:01:16.293 回答
1

我认为这会起作用,假设您正在解决ISearchService而不是LuceneSearchService直接解决 - 在这种情况下,我认为 Unity 每次都会创建一个新实例,因为没有现有的映射。

就个人而言,我还将其注册为: container.RegisterType<ISearchService, LuceneSearchService>(new ContainerControlledLifetimeManager());

于 2009-12-17T15:50:38.530 回答