在我的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());
}

如果我很好地了解了我的消息来源,这应该给我一个Singleton LuceneSearchService实例。但是,在我的记录中,我可以看到每次请求此实例时都会击中我的构造函数。

我究竟做错了什么?

有帮助吗?

解决方案

对于单身人士,您应该在功能外移动容器的定义,并使其静态。默认情况下将其设置为空。

然后在您的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());

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top