2009-12-17 7 views
1

dans mon application asp.net-mvc J'ai une application MvcApplication qui appelle une méthode statique CreateContainer().Pourquoi cette instance initiée par Unity n'est-elle pas un singleton?

Dans cette méthode, je crée mon unité contenant coi:

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

Si je comprends mes sources bien, cela devrait me donner un singleton exemple LuceneSearchService. Dans ma journalisation cependant, je peux voir que mon constructeur est frappé chaque fois que cette instance est demandée.

Qu'est-ce que je fais mal?

Répondre

4

Pour un singleton, vous devez déplacer la définition du conteneur en dehors de la fonction, et la rendre statique. Définissez-le à null par défaut.

Ensuite, dans votre fonction CreateContainer, vérifiez si le conteneur est null. Si c'est le cas, créez-le et initialisez-le. sinon, il suffit de le retourner.

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

P.S. Est-ce juste moi, ou est-ce que 'var' est le mot-clé le plus surutilisé, mal utilisé, et mal compris dans C# maintenant? – TJMonk15

+0

+1. Notez qu'il est dit "ContainerControlledLifetimeManager", pas "Singleton". Puisque l'OP crée un nouveau conteneur à chaque fois, la durée de vie est très courte. Notez également que UnityContainer est IDisposable. – TrueWill

+0

Je n'utilise pas ASP.Net MVC ou Unity (si c'est quelque chose de différent de MVC?). Je sais juste comment faire un singleton :-P – TJMonk15

1

Je pense que cela fonctionnerait, en supposant que vous résolvez un ISearchService et non un LuceneSearchService directement - dans ce cas, je pense que Unity va créer une nouvelle instance chaque fois qu'il n'y aura pas de mappage existant.

Personnellement, j'inscrire également comme: container.RegisterType<ISearchService, LuceneSearchService>(new ContainerControlledLifetimeManager());

+0

Tous mes constructeurs acceptent un ISearchService. Il n'y a aucune mention de LuceneSearchService, pourtant les logs ne font pas ça ... –

+0

Merci de me pointer dans la bonne direction pour instancier mes types singleton. Avec la réponse de cette question, j'ai eu ce dont j'avais besoin –