可能是Unity初学者的问题:当使用Unity时,您还需要在已注入的对象上实现Dispose方法吗?或者这是不需要的(所以,Unity会自动完成)?这是在web应用程序的上下文中实现的。
发布于 2012-11-27 18:15:28
实现IDisposable
与Unity无关。当您的类型使用非托管资源(如文件)时,应实现该接口,这些资源不能由CLR进行垃圾回收。
Unity可以manage the lifetime你的类型和实例。对于这种情况,Unity提供了不同类型的LifeTimeManager来控制实例的生命周期。
Unity仅在您使用ContainerControlledLifetimeManager
或HierarchicalLifetimeManager
注册它们时才考虑IDisposable
接口。这意味着当您处理Unity-Container时,它还将在实现由上面指定的LifetimeManager注册的IDisposable
接口的所有实例上调用Dispose
。
当您使用TransientLifetimeManager
注册实现IDisposable
接口的类型时(在容器上调用Resolve的每个类型都会获得一个新的实例),您可以在实例上调用Dispose
。
发布于 2014-02-19 02:17:38
为了在what Jehof said上扩展,ContainerControlledLifetimeManager
和HierarchicalLifetimeManager
都会在类上调用.Dispose()
,如果它支持它的话。然而,一个有趣的事实是,只有具体的实现需要实现IDisposable
,而您映射的接口不需要。下面是一个简单的示例程序来演示。
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.");
}
}
}
}
https://stackoverflow.com/questions/13581655
复制相似问题