Реализация "один или ничего" в контейнере MEF - PullRequest
0 голосов
/ 10 февраля 2012

Как мне убедиться, что контейнер является экземпляром класса или нет, в зависимости от того, есть ссылка на него или нет.Я использую контейнер MEF, C #

Редактировать: enter image description here

Другими словами, мне нужна возможность управлять временем жизни объектов общих классов.Например, у меня есть две точки (объекты Obj1, Obj2), которые импортируют ссылку на Shared Object (Obj3), но эти классы являются NoneShared и не живут долго, но объект (Obj3) - ссылка, которую они импортировали.большой и дорогой, он всегда хранится в памяти.

Может быть, есть другие контейнеры IoC, которые предоставят больше возможностей для работы с жизненным циклом объектов?

1 Ответ

1 голос
/ 11 февраля 2012

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

Даже если общая часть используется для заполнения импорта на удаленных объектах, эта часть все равно будет существовать с контейнером.

Вот способы обойти это:

1: Измените политику создания для части на NonShared, используя следующий атрибут в вашем экспорте:

[PartCreationPolicy(CreationPolicy.NonShared)]

2: Вы можете освободить определенную деталь, используя метод ReleaseExport для контейнера ( doc doc ). Обратите внимание, что это снова будет работать только с частями NonShared.

3: использовать дочерний контейнер для вашей общей части ( doc ). Таким образом, вы можете избавиться от дочернего контейнера, который, в свою очередь, избавится от его общих частей. Вы можете использовать дочерний контейнер при использовании, чтобы убедиться, что он утилизируется после использования. Это единственный способ избавиться от разделяемой части в контейнере.

Ох и кстати,

Возможно, есть другие контейнеры IoC,

MEF технически не является контейнером IoC. Он использует концепцию IoC, и вы можете использовать его так же, как контейнер IoC, но это, прежде всего, инфраструктура расширения.

...