Как я могу отсоединить объекты, содержащие импорт полей, от контейнера моего приложения MEF? - PullRequest
0 голосов
/ 21 января 2011

Я пишу приложение WPF, которое использует MEF в .Net 4. У моего приложения есть CompositionContainer, к которому обращаются все мои модели представлений, чтобы получить доступ (используя MEF) к некоторым общим объектам, которые отвечают за поиск данных ихранилище.

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

Ниже приведена моя попытка примерно показать, как я использую MEF.Я надеюсь, что кто-то может показать мне, как я делаю это неправильно.

Код в App.xaml.cs

public partial class App : Application
{
    private static CompositionContainer _container;
    internal static CompositionContainer Container { get { return _container; } }

    private void OnStartup(object sender, StartupEventArgs e)
    {
        AssemblyCatalog catalog = new  AssemblyCatalog(Assembly.GetExecutingAssembly());
        _container = new CompositionContainer(catalog);
    }
}

Контрактный интерфейс

открытый интерфейс ICostCentreService: IBaseEntityService {...}

Экспортированный класс, реализующий интерфейс

[PartCreationPolicy (CreationPolicy.Shared)] [Экспорт (typeof)(ICostCentreService))] открытый класс CostCentreService: BaseEntityService, ICostCentreService {...}

мой класс модели представления

открытый класс CostCentreViewModel: ViewModelBase {[Import] private ICostCreSS_costCentreService;

   public CostCentreViewModel()
   {
       App.Container.ComposeParts(this);
   }

}

Надеемся, что приведенный выше фрагмент кода достаточно нарисовать, чтобы показать, как я использую MEF.Проблема возникает после того, как я закончу использовать модель представления, и я вызываю Dispose и удаляю все ссылки на нее, он не собирает мусор, потому что контейнер приложения все еще ссылается на него.(В случае, если у меня на экране в данный момент, профилировщик памяти говорит, что на мою модель представления все еще ссылается App._containner._partExportProvider._parts._items [0] ._ cashedIntance).

Итак, яинтересно как мне избавиться от этой ссылки.Я правильно не использую MEF?

Любая помощь будет высоко ценится.

Приветствия,

Ник Барретт

1 Ответ

0 голосов
/ 21 января 2011

Общие части не будут освобождены, пока контейнер не будет утилизирован. Совместно используемая часть означает, что только один будет создан для каждого контейнера. Контейнер MEF сохраняет ссылку на него, потому что, если он когда-либо снова запрашивает эту часть, он должен вернуть тот, который уже был создан, вместо создания нового.

Для деталей, не имеющих общего доступа, существуют способы, с помощью которых MEF может выпускать ссылки на них.

...