Может ли IActivationFactory возвращать один и тот же экземпляр несколько раз?
Изучая 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)
Я интерпретирую это так: каждый экземпляр генерирует новый RCW для объекта WinRT. Таким образом, это не совсем то же самое, что синглтон, но, может быть, достаточно близко.
Я не изучал другие языковые прогнозы.
Я собираюсь использовать это для неизменяемых объектов, которые могут даже не иметь параметров конструктора. (Если они это сделают, фабрика активации должна будет сохранить карту экземпляров.) Преимущество состоит в основном в уменьшении занимаемой памяти.
Но я иду по опасным водам здесь? Я видел подобные конструкции в COM/ATL, но как насчет WinRT?