экземпляр класса, хранящийся в контейнере композиции в mef - PullRequest
2 голосов
/ 12 апреля 2011

Я понимаю, что MEF CompositionContainer создает и хранит экземпляры классов.Я не знаю, при каких обстоятельствах CompositionContainer имеет экземпляр класса в своих недрах.

  1. Может ли кто-нибудь перечислить операции, выполненные над CompositionContainer или методами класса CompositionContainer, которые заставляют CompositionContainer хранить экземпляр класса в CompositionContainer.
  2. Можно ли просмотреть классэкземпляры, хранящиеся в CompositionContainer в отладчике или каким-либо другим способом?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

CompositionContainer будет хранить ссылки на все общие части в течение всего времени существования CompositionContainer.(По умолчанию CreationPolicy - Любой как для импорта, так и для экспорта, что означает, что по умолчанию все части будут совместно использоваться, если не указано иное.)

Ссылки на неотделенные части будут сохранены, если часть реализует IDisposable.Ссылка будет освобождена при освобождении корневого экспорта, извлеченного из контейнера (если этот экспорт был из части NonShared).Экспорт может быть освобожден либо путем вызова CompositionContainer.ReleaseExport, либо ExportLifetimeContext.Dispose для экспорта, созданного с помощью ExportFactory.

Я не думаю, что существует какой-либо простой способ просмотра содержимого CompositionContainer.Исходный код доступен, поэтому вы можете теоретически погрузиться в него и выяснить, где именно он хранится.

1 голос
/ 10 мая 2013

Относительно вашего второго вопроса (№2 выше) ...

Используя окно QuickWatch (Shift + F9) или обычное окно просмотра, скопируйте туда следующее: ((System.ComponentModel.Composition.Hosting.CompositionContainer)(this.Container))._catalogExportProvider._activatedParts

В строке выше предполагается, что объект, на котором вы остановились, имеет свойство this.Container, которое является CompositionContainer области действия, на которую вы ссылаетесь.

Оттуда вы получите массив ActivatedParts. Затем вы перемещаетесь по словарю деталей. Найдите определение детали, для которого вы хотите найти экземпляр, и разверните его «Непубличные члены». Там вы найдете CachedInstance, и это будет экземпляр вашей "Совместно используемой" экспортированной детали, которая была создана.

Я думаю, что части, которые экспортируются как NonShared и не IDisposable, не кэшируются и не хранятся вообще. По крайней мере, такое поведение я видел.

Quick Watch

...