在探索WinRT时,我做了一个单身实验:通过自己实现IActivationFactory,我可以在ABI级别创建一个单例。工厂每次只返回相同的实例。通过扩展,对我的类型的任何RoActivateInstance调用都将返回相同的指针。
与.NET互操作时,奇怪的是几乎透明:
var obj1 = new MySingleton();
var obj2 = new MySingleton();
// At the .NET type level, not the same: ReferenceEquals(obj1, obj2) == false
// At the COM level, the same: Marshal.GetIUnknownForObject(obj1) == Marshal.GetIUnknownForObject(obj2)
我解释这个的方式是每个实例化都为WinRT对象生成一个新的RCW。因此,它与单身人士并不完全相同,但可能足够接近。
我没有检查其他语言预测。
我的目的是将此用于 immutable 对象,它们甚至可能没有任何构造函数参数。 (如果他们这样做,激活工厂将需要保留实例映射。)好处主要是减少了内存占用。
但我在这里踩着危险的水吗?我在COM / ATL中看到了类似的结构,但在WinRT中呢?