我需要一种方法来跟踪各种类的实例,而不需要那些知道它们被跟踪的类。基本上,我有一个类工厂,它创建实例并将它们交给另一个线程。一旦该线程完成并卸载实例,我需要得到通知,这样我就可以引用计数并在所有实例都消失后从我的类工厂退出。
挑战在于我无法修改我将加载的任何类,因为我无法控制它们的源代码。
跟踪我创建的实例很简单,我可以在创建它们时将它们放入某种集合中。跟踪他们的破坏导致我的问题。如果我可以修改源代码,我会向每个类添加一个事件,当我创建一个实例时,我会挂钩事件并将其用作我的通知。但我不能这样做。
所以,问题是:是否有一种偷偷摸摸的方式来监控对象实例并检测它何时被销毁?
答案 0 :(得分:11)
由于您正在创建对象,因此您似乎可以返回Decorator而不是实际的实例。
通过使用Decorator Pattern,您可以将返回的对象“包装”在您自己的装饰API中。装饰可以提供IDisposable实现,提供您的销毁通知。
答案 1 :(得分:5)
无法获得有效通知,但您可以对对象保留WeakReference
并定期检查是否有人死亡。
编辑:我比Reed更喜欢Reed的答案!
答案 2 :(得分:2)
如果您拥有对您创建的实例的引用列表,那么它们将不会被垃圾收集,因此永远不会被销毁......
相反,您可以创建一个存储库,其中包含Guids列表并为每个实例创建一个新的Guid,然后将其添加到列表中 - 类似于FactoryRepository。通过这种方式,您没有垃圾收集的引用问题,因为Guids是结构而不是引用类型。然后,您可以从每个类继承以创建可以在destroy上通知的类型。我假设你不能改变原始类的代码,你也不能改变这些类的消费者,因此装饰模式(通过接口)之类的东西已经输出,因为类型不兼容。
非常简化的例子:
public class OriginalClassDestroyNotifier : OriginalClass
{
private readonly Guid _instanceId;
public OriginalClassDestroyNotifier(Guid instanceId)
{
_instanceId = instanceId;
}
~OriginalClassDestroyNotifier()
{
FactoryRepository.NotifyDestroyed(_instanceId);
}
}
答案 3 :(得分:1)
你如何控制对象的破坏:
public void Destroy(T obj)
{
if (obj == null)
throw new ArgumentNullException("obj");
if (!_living.Contains(obj))
throw new ArgumentException("Where did this obj come from?");
using (obj as IDisposable)
{
}
_living.Remove(obj); // List?
}