首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Unity中处理所需的?

在Unity中处理所需的?
EN

Stack Overflow用户
提问于 2012-11-27 18:01:46
回答 2查看 25.3K关注 0票数 29

可能是Unity初学者的问题:当使用Unity时,您还需要在已注入的对象上实现Dispose方法吗?或者这是不需要的(所以,Unity会自动完成)?这是在web应用程序的上下文中实现的。

EN

回答 2

Stack Overflow用户

发布于 2012-11-27 18:15:28

实现IDisposable与Unity无关。当您的类型使用非托管资源(如文件)时,应实现该接口,这些资源不能由CLR进行垃圾回收。

Unity可以manage the lifetime你的类型和实例。对于这种情况,Unity提供了不同类型的LifeTimeManager来控制实例的生命周期。

Unity仅在您使用ContainerControlledLifetimeManagerHierarchicalLifetimeManager注册它们时才考虑IDisposable接口。这意味着当您处理Unity-Container时,它还将在实现由上面指定的LifetimeManager注册的IDisposable接口的所有实例上调用Dispose

当您使用TransientLifetimeManager注册实现IDisposable接口的类型时(在容器上调用Resolve的每个类型都会获得一个新的实例),您可以在实例上调用Dispose

票数 30
EN

Stack Overflow用户

发布于 2014-02-19 02:17:38

为了在what Jehof said上扩展,ContainerControlledLifetimeManagerHierarchicalLifetimeManager都会在类上调用.Dispose(),如果它支持它的话。然而,一个有趣的事实是,只有具体的实现需要实现IDisposable,而您映射的接口不需要。下面是一个简单的示例程序来演示。

代码语言:javascript
复制
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.");
            }
        }
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13581655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档