web-dev-qa-db-fra.com

Disposer nécessaire dans l'unité?

Probablement une question de débutant de l'unité: lors de l'utilisation de l'unité, auriez-vous toujours besoin de mettre en œuvre des méthodes sur les objets que vous avez injectés? Ou même cela n'est-il pas nécessaire (donc, fait automatiquement par unité)? Ceci est dans le contexte d'une application Web.

26
hetnet

La mise en œuvre IDisposable n'a rien à voir avec l'unité. Vous devez implémenter l'interface lorsque votre type utilise des ressources non gérées aime les fichiers, qui ne peuvent être recueillis par le CLR.

L'unité peut gérer la durée de vie de vos types et instances. Pour cette affaire, l'unité fournit des différents types de LifeMeMemanager pour contrôler la durée de vie de vos instances.

L'unité ne respecte que l'interface IDisposable lorsque vous les enregistrez à l'aide du ContainerControlledLifetimeManager ou de HierarchicalLifetimeManager. Cela mène lorsque vous disposez lorsque vous disposez de l'unité-conteneur, il appellera également Dispose sur toutes les instances mettant en œuvre l'interface IDisposable enregistrée par le lifetimanager nommé ci-dessus.

Lorsque vous enregistrez des types qui implémentent l'interface IDisposable à l'aide de TransientLifetimeManager (vous obtenez des nouvelles instances que chaque type que vous appelez résoudre sur le conteneur), vous devez appeler Dispose sur l'instance.

24
Jehof

S'étendre sur ce que Jehof a dit , ContainerControlledLifetimeManager et HierarchicalLifetimeManager _ _ tous les deux appellent .Dispose() sur la classe si elle le supporte. Cependant, un fait intéressant est que la mise en œuvre concrète doit implémenter IDisposable, l'interface que vous mapping ne le fait pas. Voici un exemple simple pour démontrer.

using System;
using System.Threading;
using Microsoft.Practices.Unity;

namespace ConsoleApplication
{
    internal class Program
    {
        private interface IFoo
        {
        }

        private class Foo : IFoo, IDisposable
        {
            public Foo()
            {
                Console.WriteLine("Foo Created");
            }

            public void Dispose()
            {
                Console.WriteLine("Foo.Dispose() called");
            }
        }

        private class Bar
        {
            public Bar(IFoo foo)
            {
            }
        }

        private static void Main()
        {
            LifetimeManager manager;

            Console.WriteLine("Choose a lifetime manager to test:");
            Console.WriteLine(" 1: ContainerControlledLifetimeManager");
            Console.WriteLine(" 2: ExternallyControlledLifetimeManager");
            Console.WriteLine(" 3: HierarchicalLifetimeManager");
            Console.WriteLine(" 4: PerThreadLifetimeManager");
            Console.WriteLine(" 5: TransientLifetimeManager");

            int choice = int.Parse(Console.ReadLine());
            switch (choice)
            {
                case 1:
                    manager = new ContainerControlledLifetimeManager();
                    break;
                case 2:
                    manager = new ExternallyControlledLifetimeManager();
                    break;
                case 3:
                    manager = new HierarchicalLifetimeManager();
                    break;
                case 4:
                    manager = new PerThreadLifetimeManager();
                    break;
                case 5:
                    manager = new TransientLifetimeManager();
                    break;
                default:
                    return;
            }

            Console.WriteLine(manager.ToString());

            //Use a thread to test PerThreadLifetimeManager's Dispose actions.
            var thread = new Thread(() => PerformTest(manager));
            thread.Start();
            thread.Join();


            Console.WriteLine("Press enter to exit...");
            Console.ReadLine();
        }

        private static void PerformTest(LifetimeManager manager)
        {
            Console.WriteLine("Pre container creation");
            using (IUnityContainer container = new UnityContainer())
            {
                Console.WriteLine("Pre type regrestration");
                container.RegisterType<IFoo, Foo>(manager);

                Console.WriteLine("Pre bar1 resolve");
                var bar1 = container.Resolve<Bar>();

                Console.WriteLine("Pre bar2 resolve");
                var bar2 = container.Resolve<Bar>();

                Console.WriteLine("Leaving container scope.");
            }
        }
    }
}
7
Scott Chamberlain